2016-05-23 49 views
1

我有一个表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)"; 

谢谢!

+1

你试过添加'ORDER BY message_date DESC'吗? – jakob

+0

@jakob这会有什么帮助? – sagi

回答

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"; 
+0

谢谢你的回答。数据未分组,查询结果为: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 –

+0

@RazvanT。哦,我看每个名称的ID是不一样的,现在试试这个应该可以工作 – sagi

0

为什么这么复杂?这应该工作:

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

EDIT1:好了,现在我看到你的问题。该集团由订单之前发生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 
+0

谢谢你的回答,但是查询不能正常工作。数据被分组,但排序不是按降序排列。查询结果是:2,Jonny,Doe,2016-05-22,15:23:05; 1,John,Doe,2016-04-24,11:13:24。不知何故,GROUP BY和ORDER BY不能一起正常工作。 –

+0

好了现在你的问题。请参阅我的编辑 – ckay

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

谢谢!数据已分组,但GROUP BY数据未按降序排列。查询结果是:2,Jonny,Doe,2016-05-22,15:23:05; 1,John,Doe,2016-04-24,11:13:24。 –

+0

你想按日期或时间排序吗? –

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";