php объединяет 2 таблицы по дате - PullRequest
3 голосов
/ 30 мая 2011

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

Так что table1 имеет вид:

table1

  • id
  • post_id
  • post_date

table2

  • id
  • comment_id
  • comment_date

я хочу показать все из таблицы 1, таблицы 2 и отсортировать по дате

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

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

проблема в том, чтоя не знаю, как определить, какой элемент (запись или комментарий) я использую в то время как (row = 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

Ответы [ 3 ]

3 голосов
/ 30 мая 2011

Попробуйте 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 голос
/ 30 мая 2011

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

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

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'";
....

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

0 голосов
/ 31 мая 2011
                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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...