php проблема объединения 2 таблиц по дате

#mysql #join

#mysql #Присоединиться

Вопрос:

Итак, у меня есть 2 таблицы, в которых нет ни одного общего столбца, и я хочу сохранить их по столбцу даты

Итак, table1 выглядит как:

table1

  • ID
  • post_id
  • post_date

table2

  • ID
  • comment_id
  • comment_date

я хочу показать все из table1, table2 и отсортировать это по дате

я попробовал что-то вроде

 SELECT * FROM table1 INNER JOIN table2 ORDER BY post_date DESC, comment_date DESC
  

проблема в том, что я не знаю, как определить, какой элемент (запись или комментарий) я использую внутри while (rows = mysql_fetch_assoc()), поскольку у меня разные имена столбцов.

Решение было:

                 SELECT * FROM (
                SELECT 1 AS `table`, `col1` AS `userid`, `col2` AS `cat`, `col3` AS `item_id`, `title` AS `title`, etc... , `date` AS `date` FROM `table1`
                UNION
                SELECT 2 AS `table`, `col1` AS `userid`, `col2` AS `cat`, `col3` AS `item_id`, NULL AS `title`, etc... , `date` AS `date` FROM `table2`
            ) AS tb
            ORDER BY `date` DESC
  

Комментарии:

1. Опишите, я не знаю, как определить, какой элемент (сообщение или комментарий)

2. итак, допустим, в моей таблице1 есть несколько записей, но таблица2 по-прежнему равна нулю… как мне узнать, какие данные отображать? table1 или table2? поскольку у меня разные столбцы в обеих таблицах

3. В вашей теме говорится, что вы хотите объединить по дате, но ваш код объединяет по идентификатору. Для меня это не имеет смысла. Вообще. Чего именно вы хотите достичь?

4. поскольку я использую ORDER BY post_date DESC, comment_date DESC, не является ли это объединением 2 таблиц и отображением их по дате? я пытаюсь показать все записи из этих 2 таблиц по дате

5. Комментарии не связаны с сообщениями?

Ответ №1:

Попробуйте UNION с новым постоянным столбцом, указывающим, какая таблица выводится, и сделайте имена столбцов одинаковыми, используя AS .

Окружение SELECT может позволить вам упорядочить их вместе.

 SELECT * FROM (
    (SELECT 1 AS `table`, `id`, `post_id` AS `table_id`, `post_date` AS `date` FROM `table1`)
    UNION
    (SELECT 2 AS `table`, `id`, `comment_id` AS `table_id`, `comment_date` AS `date` FROM `table2`)
)
ORDER BY `date` DESC
  

Это потребует тестирования, не уверен, разрешено ли это.

Комментарии:

1. приведенный выше код работает не так, как я хочу, я должен назначить все столбцы из 2 таблиц и иметь одинаковое имя ключа, например post_date = date и comment_date = date, что я хочу, так это проверить, из какой таблицы я получаю данные при каждом запуске цикла while (который извлекает данные). в любом случае спасибо.

2. @fxuser: Это то, что должно произойти с этим кодом. Вы используете table поле для определения источника. Поля унифицированы в соответствии с запросом.

3. дело в том, что в одной таблице столбцы фактически не совпадают с другой таблицей, и у меня возникли проблемы с отображением данных… я попробую с union

4. @fxuser: Когда вы говорите, не совпадают? Что вы имеете в виду? Если вы имеете в виду, что нет общих полей, то UNION это то, что вам нужно. Если вы имеете в виду, что это разные типы данных, то вам придется выполнить какое-то преобразование или разделить данные.

5. @fxuser, нет, ты этого не делаешь, просто укажите , null as missing_field в поле выбора для таблицы с отсутствующим полем.

Ответ №2:

Вам придется переделать свою базу данных, если вы хотите связать записи с комментариями.

Учитывая эти таблицы

 table1

    id
    post_id
    post_date

table2

    id
    comment_id
    comment_date
  

И тот факт, что комментарии должны быть комментариями, принадлежащими сообщениям, вам нужно изменить таблицы, чтобы их структура стала:

 table post

    id         /*id of a post*/
    user_id    /*which user posted this*/
    post_date  /*when?*/
    post_text  /*the text inside the post*/

table comments

    id            /*id of a comment*/
    post_id       /*which post does this comment belong to*/
    user_id       /*who posted this*/
    comment_date  /*when*/
    comment_text  /*text of the comment*/
  

Теперь вы можете объединить это, выполнив:

 $post_id = mysql_real_escape_string($_GET['post_id']);

/*select all comments belonging to a post*/
$query = "SELECT c.user_id, c.comment_date, c.comment_text FROM posts p
          INNER JOIN comments c ON (c.post_id = p.id)
          WHERE p.id = '$post_id'";
....
  

В вашем текущем дизайне нет способа надежно объединить их, потому что между ними нет связи.

Комментарии:

1. я не совсем ясно выразился, эти 2 таблицы являются простым примером, я хочу показать их все в порядке убывания по дате добавления в базу данных, таблица1 может быть ссылками, таблица2 может быть tas и так далее, я просто хочу показать, как они убывают по дате добавления

2. @fxusers, @Orbling уже ответил на это, вы должны принять его ответ. Все еще ваш пример не имеет никакого смысла, домашнее задание?

3. это не домашнее задание, я просто создаю несколько сценариев для веб-приложения

Ответ №3:

                 SELECT * FROM (
            SELECT 1 AS `table`, `col1` AS `userid`, `col2` AS `cat`, `col3` AS `item_id`, `title` AS `title`, etc... , `date` AS `date` FROM `table1`
            UNION
            SELECT 2 AS `table`, `col1` AS `userid`, `col2` AS `cat`, `col3` AS `item_id`, NULL AS `title`, etc... , `date` AS `date` FROM `table2`
        ) AS tb
        ORDER BY `date` DESC