【问题标题】:How can I sort descending the result of a Group by?如何对 Group by 的结果进行降序排序?
【发布时间】:2016-05-23 13:37:00
【问题描述】:

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

idsurnamenamemessagemessage_date

我正在尝试编写正确的查询,以便显示按surname 分组并按日期降序排序的所有行(我希望该组仅显示最近的记录,基于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

我尝试使用以下查询,但无法正常工作:

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

谢谢!

【问题讨论】:

  • 你试过加ORDER BY message_date DESC吗?
  • @jakob 那有什么帮助?

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


【解决方案1】:

您的问题是您还使用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";

【讨论】:

  • 感谢您的回答。数据未分组,查询结果为:3,John,Doe,另一条消息,2016-05-23 16:10:07; 2、Jonny,Doe,你好,2016-05-22 15:23:05; 1、John,Doe,我的消息,2016-04-24 11:13:24
  • @RazvanT。哦,我看到每个名字的 ID 都不一样,现在试试这应该可以工作
【解决方案2】:
 $sql="SELECT id, surname, name, message, message_date FROM messages 
       GROUP BY surname ORDER BY TIME(message_date) DESC";

【讨论】:

  • 谢谢!数据已分组,但 GROUP BY 数据未按降序排序。查询结果为:2, Jonny, Doe, 2016-05-22, 15:23:05; 1,约翰,多伊,2016 年 4 月 24 日,11:13:24。
  • 您要按日期或时间排序吗?
【解决方案3】:

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

$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】:

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

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

    Edit1:好的,现在我看到了您的问题。 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, Jonny, Doe, 2016-05-22, 15:23:05; 1,约翰,多伊,2016-04-24,11:13:24。不知何故,GROUP BY 和 ORDER BY 不能一起正常工作。
    【解决方案5】:

    当我面临类似情况时,我偶然发现了这一点。但是,我无法使用发布的答案,因为我正在应用其他过滤器。所以,我想出了一个不同的解决方案。希望它有所帮助(假设 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-13
      • 1970-01-01
      • 1970-01-01
      • 2011-06-28
      • 1970-01-01
      • 1970-01-01
      • 2018-09-11
      • 2011-05-25
      相关资源
      最近更新 更多