Расширенный JOIN Query в MySQL? - PullRequest
1 голос
/ 29 ноября 2010

Прежде всего, извините за мой плохой английский ...

У меня проблема с одним из моих запросов MySQL. У меня есть две таблицы: сообщения и ответы. Таблица сообщений содержит поле id, Discussion_id, Content и Date. Таблица ответов содержит поле id, message_id, content и date.

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

(Нравится Facebook)

Я могу сделать это так:

SELECT * FROM messages WHERE discussion_id = 'test' ORDER BY date DESC;

А затем используйте цикл foreach PHP для

SELECT * FROM replies WHERE message_id = 'test' ORDER BY date ASC;

Но если бы я использовал это, у меня 11 запросов, что не идеально. Я думал о присоединении или объединении, но если бы я это сделал, ответы и сообщения не были разделены. Список отсортирован по replies.date, но ответы и их родительское сообщение больше не вместе. Я использую это:

SELECT * FROM messages LEFT JOIN replies ON messages.id = replies.message_id WHERE discussion_id='4cc43b40586b6' ORDER BY replies.date DESC

Можно ли сделать один запрос для этой задачи?

Ответы [ 2 ]

3 голосов
/ 29 ноября 2010

А как насчет ключевого слова IN?Вы можете сократить его до двух запросов, так как вы хотите, чтобы ответы были отделены от сообщений.Первый запрос уже подойдет, но для второго (я еще не проверял его в отношении базы данных, поэтому синтаксис может быть немного отключен):

SELECT * 
FROM replies 
WHERE message_id IN (
    SELECT message_id 
    FROM messages 
    WHERE discussion_id = 'test'
) 
ORDER BY date ASC;

edit (за предложение в комментарии)

Вы также можете изменить свое объединение выше для повышения производительности;он по-прежнему дает вам всего два запроса, но вы все равно хотели получить два набора результатов:

SELECT * 
FROM replies 
LEFT JOIN messages ON messages.id = replies.message_id 
WHERE discussion_id='4cc43b40586b6' 
ORDER BY replies.date ASC
1 голос
/ 29 ноября 2010

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

SELECT
      messages.id AS messageid,
      replies.id AS replyid,
      *WHATEVER OTHER COLUMNS*
 FROM replies, messages 
WHERE replies.message_id = messages.discussion_id
  AND messages.discussion_id = 'test'
ORDER BY replies.date ASC;

Я не совсем уверен, что это именно то, что вы ищете, но это может помочь вам начать.

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