MySql оптимизирует JOIN и намного лучше, чем коррелированные подзапросы, так что я буду ходить через присоединиться к подходу.
Первый шаг, чтобы получить максимальную ts_send
за разговор:
SELECT conversations_id, MAX(ts_send) AS ts_send
FROM messages
GROUP BY conversations_id;
Затем нужно JOIN
это обратно к таблице сообщений, чтобы получить фактическое сообщение.Присоединиться на conversation_id и MAX (ts_send) гарантирует, что только последнее сообщение возвращается для каждого разговора:
SELECT messages.conversations_id,
messages.message,
Messages.ts_send
FROM messages
INNER JOIN
( SELECT conversations_id, MAX(ts_send) AS ts_send
FROM messages
GROUP BY conversations_id
) MaxMessage
ON MaxMessage.conversations_id = messages.conversations_id
AND MaxMessage.ts_send = messages.ts_send;
выше, должны получить, что вы после этого, если вы также не нужны разговоры вернулся, где не было никаких сообщений , В этом случае вам нужно будет выбрать из conversations
и LEFT JOIN в приведенном выше запросе:
SELECT conversations.id,
COALESCE(messages.message, 'No Messages') AS Message,
messages.ts_send
FROM conversations
LEFT JOIN
( SELECT messages.conversations_id,
messages.message,
Messages.ts_send
FROM messages
INNER JOIN
( SELECT conversations_id, MAX(ts_send) AS ts_send
FROM messages
GROUP BY conversations_id
) MaxMessage
ON MaxMessage.conversations_id = messages.conversations_id
AND MaxMessage.ts_send = messages.ts_send
) messages
ON messages.conversations_id = conversations.id;
EDIT
Последний вариант выбора всех разговоров, независимо от того, имеют ли они сообщение будет лучше achived следующим образом:
SELECT conversations.id,
COALESCE(messages.message, 'No Messages') AS Message,
messages.ts_send
FROM conversations
LEFT JOIN messages
ON messages.conversations_id = conversations.id
LEFT JOIN
( SELECT conversations_id, MAX(ts_send) AS ts_send
FROM messages
GROUP BY conversations_id
) MaxMessage
ON MaxMessage.conversations_id = messages.conversations_id
AND MaxMessage.ts_send = messages.ts_send
WHERE messages.ts_send IS NULL
OR MaxMessage.ts_send IS NOT NULL;
Благодаря здесь идет в spencer7593, кто предложил вышеупомянутое решение.
Не могли бы вы поделиться с sql friddle со структурой таблицы и некоторыми данными? IN ошибается, это PHP-код. –
Кроме того, я не думаю, что вам нужна 'JOIN' здесь ... –