如何对Group的结果进行降序排序?

时间:2016-05-23 13:37:01

标签: mysql sorting group-by sql-order-by

我有一个表messages,其中包含以下字段:

idsurnamenamemessagemessage_date

我正在尝试编写正确的查询,以便显示按surname分组的所有行,并按日期降序排序(我希望该组仅显示最新记录,基于{{1 }})。

例如,如果我有以下记录:

message_date

我想获得以下结果:

 - 1, John   Doe, my message, 2016-04-24 11:13:24
 - 2, Johnny Doe, hello, 2016-05-22 15:23:05
 - 3, John Doe, another message, 2016-05-23 16:10:07

我尝试使用以下查询,但它无法正常运行:

 - 3, John   Doe, another message, 2016-05-23 16:10:07 
 - 2, Johnny Doe, hello, 2016-05-22 15:23:05

谢谢!

5 个答案:

答案 0 :(得分:0)

您的问题是您还在message语句中使用IN(),这在每条消息之间是不同的。丢弃它,这应该有效:

$sql="SELECT *
      FROM   messages
      WHERE  (surname, name, message_date) IN (SELECT surname, name, MAX(message_date)
                                                   FROM messages
                                                   GROUP BY surname, name)
      ORDER BY message_date DESC";

答案 1 :(得分:0)

为什么这么复杂?这应该有效:

SELECT id,surname,name,message_date FROM messages 
GROUP BY surname
ORDER BY message_date DESC

编辑1:现在好了,我看到了您的问题。 Group By发生在ORder BY之前

我自己尝试过,这样做效果更好:

SELECT x.* FROM  messages x
JOIN(SELECT surname,max(message_date) max_date FROM messages GROUP BY surname) y
ON y.surname=x.surname
AND y.max_date=x.message_date

答案 2 :(得分:0)

 $sql="SELECT id, surname, name, message, message_date FROM messages 
       GROUP BY surname ORDER BY TIME(message_date) DESC";

答案 3 :(得分:0)

我设法通过使用以下查询解决了这个问题:

$sql="SELECT * FROM (SELECT surname, MAX(message_date) AS message_date FROM messages GROUP BY surname) AS x JOIN messages USING (surname, message_date) ORDER BY message_date DESC";

答案 4 :(得分:0)

当我遇到类似的情况时,我偶然发现了这一点。但是,当我应用其他过滤器时,我无法使用已发布的答案。所以,我想出了一个不同的解决方案。希望它有所帮助(假设id是唯一的)。

SELECT id, surname, name, message_date FROM messages as a 
WHERE a.`id` = (SELECT b.`id` FROM `messages` WHERE a.`surname` = b.`surname`
ORDER BY b.`id` DESC LIMIT 1 ) 
GROUP BY surname ORDER BY message_date DESC