我有一个表messages
,其中包含以下字段:
id
,surname
,name
,message
,message_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
谢谢!
答案 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)
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