Слияние 2 запросов MySQL и упорядочение результатов по отметке времени - PullRequest
1 голос
/ 01 февраля 2012

У меня есть запрос, который возвращает все сообщения от пользователей (с комментариями):

SELECT  *
FROM   (SELECT *
       FROM stream_ps
       ORDER BY stream_ps_timestamp DESC
       LIMIT $offset, $limit) sps
        JOIN user_profiles
          ON user_id = sps.stream_ps_author_id
        LEFT JOIN (SELECT stream_cm_id,
                          stream_cm_author_id,
                          stream_id_fk,
                          stream_ps_id_fk,
                          stream_cm_text,
                          stream_cm_timestamp,
                          first_name as comm_first_name,
                          last_name as comm_last_name,
                          facebook_id as comm_fb_id,
                          picture as comm_picture
                    FROM  stream_cm
                    JOIN  user_profiles
                      ON  user_id = stream_cm_author_id) AS c
          ON sps.stream_ps_id = c.stream_ps_id_fk
ORDER   BY sps.stream_ps_id DESC, c.stream_cm_id ASC

и другой запрос, который возвращает все сообщения на форуме:

SELECT  qa.*,
        user_profiles.*,
        n.pid,
       Ifnull(n.ans_count, 0) AS ans_count
FROM  (SELECT * FROM forum_qa
       ORDER BY forum_qa_type,forum_qa_timestamp DESC
       LIMIT $offset, $limit) qa
       LEFT JOIN user_profiles
         ON user_id = qa.forum_qa_author_id
       LEFT JOIN (SELECT forum_qa_parent_id AS pid,
                         COUNT(*)           AS ans_count
                  FROM   forum_qa
                  WHERE  forum_qa_parent_id IS NOT NULL
                  GROUP  BY forum_qa_parent_id) AS n
         ON qa.forum_qa_id = n.pid
WHERE  qa.forum_qa_type = 1
ORDER  BY qa.forum_qa_timestamp DESC

Я хотел бы объединить оба запроса в один запрос и переупорядочить результаты так, чтобы они были в обратном хронологическом порядке (т. Е. Метка времени DESC, при этом последний показ был первым).

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

Есть ли способ сделать это?

Ответы [ 3 ]

1 голос
/ 01 февраля 2012

Поскольку таблицы имеют разные поля, если вам действительно нужно выполнить сортировку в SQL, вы можете объединить два набора результатов в одну большую таблицу, в которой есть поля для обоих.Что-то вроде

SELECT * FROM (
    SELECT col1, col2, null, null, time_stamp FROM table1
    UNION
    SELECT null, null, colA, colB, time_stamp FROM table2
) entries
ORDER BY time_stamp DESC
LIMIT $offset, $limit
0 голосов
/ 01 февраля 2012

Звучит так, как вы хотите UNION . Чтобы использовать UNION, вам нужно убедиться, что столбцы совпадают; из документов

UNION используется для объединения результата из нескольких операторов SELECT в один набор результатов.

Имена столбцов из первого оператора SELECT используются как имена столбцов для возвращенных результатов. Выбранные столбцы перечислены в соответствующие позиции каждого оператора SELECT должны иметь одинаковые тип данных.

Базовое использование похоже на это

SELECT id, value FROM tableA
UNION
SELECT id, value FROM tableB
ORDER BY id

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

0 голосов
/ 01 февраля 2012

Я думаю, что вы ищете UNION .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...