如何对 Group by 的结果进行降序排序?
How can I sort descending the result of a Group by?
我有一个 table messages
,其中包含以下字段:
id
、surname
、name
、message
、message_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)";
谢谢!
您的问题是您还在 IN()
语句中使用了 message
,这在每条消息之间是不同的。丢弃它,这应该有效:
$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";
为什么这么复杂?这应该有效:
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
$sql="SELECT id, surname, name, message, message_date FROM messages
GROUP BY surname ORDER BY TIME(message_date) DESC";
我已经使用以下查询设法解决了这个问题:
$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";
当我遇到类似情况时,我偶然发现了这个。但是,我无法使用发布的答案,因为我正在应用其他过滤器。所以,我想出了一个不同的解决方案。希望它有所帮助(假设 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
我有一个 table messages
,其中包含以下字段:
id
、surname
、name
、message
、message_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)";
谢谢!
您的问题是您还在 IN()
语句中使用了 message
,这在每条消息之间是不同的。丢弃它,这应该有效:
$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";
为什么这么复杂?这应该有效:
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
$sql="SELECT id, surname, name, message, message_date FROM messages
GROUP BY surname ORDER BY TIME(message_date) DESC";
我已经使用以下查询设法解决了这个问题:
$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";
当我遇到类似情况时,我偶然发现了这个。但是,我无法使用发布的答案,因为我正在应用其他过滤器。所以,我想出了一个不同的解决方案。希望它有所帮助(假设 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