我正在尝试对查询结果进行排序,以便具有最新日期的行在结果集中排在第一位。我还需要查询然后将所有conversation_id
组合在一起。
这是我当前的查询:
SELECT conv.conversation_id, conv.user_id, conv.contact_id, msg.message_id, msg.message, msg.sent_date
FROM (SELECT * FROM message ORDER BY sent_date DESC) as msg
LEFT JOIN conversation AS conv
ON conv.contact_id = msg.contact_id
WHERE user_id = 24
ORDER BY conversation_id;
它没有正确排序。
我使用上述查询得到此表:http://imgur.com/QLoEj6H
我需要的是conversation_id
2的群组位于顶部。将查询末尾的ORDER BY
更改为DESC
将不适用于表中的所有值。
答案 0 :(得分:1)
除了减慢查询速度之外,子查询不执行任何操作。
你似乎想要通过对话排序的东西,但是最先通过最近的对话。如果是这样,您需要使用额外的join
:
SELECT conv.conversation_id, conv.user_id, conv.contact_id,
msg.message_id, msg.message, msg.sent_date
FROM message msg LEFT JOIN
conversation conv
ON conv.contact_id = msg.contact_id LEFT JOIN
(SELECT conversation_id, MAX(sent_date) as max_ent_date
FROM message
GROUP BY conversation_id
) mmax
ON mmax.conversation_id = m.conversation_id
WHERE user_id = 24
ORDER BY mmax.max_sent_date desc, m.conversation_id;
答案 1 :(得分:1)
在朋友和Gordon Linoff的回答中弄清楚了。以下是可行的代码:
SELECT conv.conversation_id, conv.user_id, conv.contact_id,
msg.message_id, msg.message, msg.sent_date
FROM message msg LEFT JOIN
conversation conv
ON conv.contact_id = msg.contact_id LEFT JOIN
(SELECT conversation_id, MAX(sent_date) as max_msg_sent_date
FROM message
GROUP BY conversation_id
) mmax
ON mmax.conversation_id = msg.conversation_id
WHERE user_id = 24
ORDER BY max_msg_sent_date desc, msg.conversation_id, msg.sent_date DESC;
答案 2 :(得分:0)
在没有子查询的情况下尝试使用ORDER BY conversation_id DESC, sent_date DESC
。
这将以conversation_id的递减顺序检索结果,如果是tie,将按照时间的降序排列它们。 (如果这是你正在寻找的)