2011-12-19 64 views
8

我有一个MySQL声明MySQL的选择GROUP BY为了

SELECT * 
FROM tbl_messages 
WHERE to_user_id = '$user_id' OR from_user_id = '$user_id' 
GROUP BY from_user_id 
ORDER BY date_sent DESC 

以他们没有按照正确的顺序是产生正确的结果。

分组运行良好,但它在组中显示的记录是输入到数据库中的第一个记录,但我希望在每个组中显示最新记录。

有没有办法为每个组显示最新的记录?

2011-12-19 12:16:25 This is the first message 
2011-12-19 12:18:20 This is the second message 
2011-12-19 12:43:04 This is the third message 

的组显示出“这是第一消息”我想去“这是第三消息”,因为这是最最近记录/消息。

干杯

+0

查询应该显示什么? – 2011-12-19 01:50:03

+0

如果你只需要两列(例如ID和最新的时间戳),这可能会起作用:http://stackoverflow.com/a/4448536/722036。它比**在具有数百万行的巨大表格上使用子查询更快**。 – 2016-06-26 11:38:29

回答

9

这可能工作(但不能保证):

SELECT * 
FROM 
    (SELECT * 
    FROM tbl_messages 
    WHERE to_user_id = '$user_id' OR from_user_id = '$user_id' 
    ORDER BY date_sent DESC 
) tmp 
GROUP BY from_user_id 
ORDER BY date_sent DESC 

这应该工作:

SELECT t.* 
FROM 
    tbl_messages AS t 
    JOIN 
    (SELECT from_user_id 
      , MAX(date_sent) AS max_date_sent 
     FROM tbl_messages 
     WHERE to_user_id = '$user_id' OR from_user_id = '$user_id' 
     GROUP BY from_user_id 
    ) AS tg 
    ON (tg.from_user_id, tg.max_date_sent) = (t.from_user_id, t.date_sent) 
ORDER BY t.date_sent DESC 
+0

这似乎在工作。需要稍作修改(在GROUP BY之前添加tbl_messages),但看起来不错。谢谢! – puks1978 2011-12-19 02:02:03

+0

谢谢救了我的一天,在学校里我学到了更多关于subquerys的知识...我不记得这些伟大的querys ...我的老师...旧的记忆 – delive 2015-12-17 14:41:40

-1

你的意思是这样的:

 
SELECT * FROM tbl_messages WHERE to_user_id = '$user_id' OR from_user_id = '$user_id' GROUP BY from_user_id ORDER BY from_user_id, date_sent DESC 

2

如果您的邮件表中有一个主键是自动递增,并且所有的消息都是由大自然最高的数字是最近的日期...但是,由于我不知道,我将基于MAX(date_sent)而不是max(SomeIDKey),但原理相同。

select 
     tm2.* 
    from 
     (select tm1.from_user_id, 
       max(tm1.date_sent) LatestMsgDate 
      from tbl_messages tm1 
      group by tm1.from_user_id) MaxPerUser 

     left join tbl_messages tm2 
     on MaxPerUser.From_User_ID = tm2.From_User_ID 
     AND MaxPerUser.LatestMsgDat = tm2.Date_Sent 

    order by 
     date_sent DESC 
+0

如何在查询结束时在MaxPerUser和GROUP BY中添加ORDER BY。 – 2017-11-01 16:03:09

+1

@MohammedAbrarAhmed,不适用于内部MaxPerUser查询。但是,如果您希望根据最近的消息日期获得外部结果,则可以使用ORDER BY MaxPerUser.LatestMsgDate - 如果这是您正在考虑将最新消息浮动到顶部的那个。 – DRapp 2017-11-02 01:20:45

8

下单后做1组,通过与包裹查询GROUP BY是这样的:

SELECT t.* FROM (SELECT * FROM table ORDER BY time DESC) t GROUP BY t.from 
+0

即使我把ASC放在查询“t”它采取DESC。 – 2017-11-01 16:04:58