SQL GROUP BY选择

时间:2012-01-13 18:46:46

标签: mysql group-by

这是我的代码:

mysql_query("SELECT * FROM messages WHERE to_user_id = '$user_id' GROUP BY from_user_id ORDER BY read,sent_date DESC")

这是我的表结构

enter image description here

我使用GROUPY BY from_user_id语句简要显示“对话”列表,而不是每条消息。喜欢这个

enter image description here

但是,正如你在图片中看到的那样,前两个是错误的方式,第一个说“1周前”,而下面的一个说“2天前”。这些错误顺序的原因是GROUP BY from_user_id语句。因为它将来自该用户的所有消息分组,并且它不会有最近的时间。

所以我的问题是:

我最近的记录如何 GROUP BY from_user_id

3 个答案:

答案 0 :(得分:6)

SELECT或其他allowed functions中未列出GROUP BY个列。这是how GROUP BY works

虽然大多数其他SQL风格会在这样的查询中失败,但MySQL却没有。相反,它提供任意结果 - 你所看到的。

您可以通过几种不同的方式解决这个问题。例如:

  • SELECT ids 在单独查询中使用GROUP BY的最新用户对话。
  • 通过选择 ID JOIN ID 的集合,在一个查询中完成所有操作。

答案 1 :(得分:2)

由于MySQL不支持像ROW_NUMBER() OVER()这样的窗口函数,你可以这样做:

SELECT * 
FROM Messages 
where id in (SELECT MAX(ID) FROM messages GROUP BY from_user_id) 
ORDER BY sent_date, read 

子查询只返回每个用户的最新消息ID。我假设你的auto_increment对应于发送消息的顺序。即使它不是你可能想要的确切逻辑,这是从MySQL中工作的分组记录中获取特定值的子集的一般技术。

答案 2 :(得分:1)

试试这个

SELECT *,MAX(id) as OrderField FROM messages WHERE to_user_id = '$user_id' 
 GROUP BY from_user_id 
 ORDER BY OrderField DESC,read