MySQL按日期排序然后按ID排序

时间:2015-01-01 22:12:50

标签: mysql sql-order-by

我正在尝试对查询结果进行排序,以便具有最新日期的行在结果集中排在第一位。我还需要查询然后将所有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将不适用于表中的所有值。

3 个答案:

答案 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,将按照时间的降序排列它们。 (如果这是你正在寻找的)