这是我的代码:
mysql_query("SELECT * FROM messages WHERE to_user_id = '$user_id' GROUP BY from_user_id ORDER BY read,sent_date DESC")
这是我的表结构
我使用GROUPY BY from_user_id
语句简要显示“对话”列表,而不是每条消息。喜欢这个
但是,正如你在图片中看到的那样,前两个是错误的方式,第一个说“1周前”,而下面的一个说“2天前”。这些错误顺序的原因是GROUP BY from_user_id
语句。因为它将来自该用户的所有消息分组,并且它不会有最近的时间。
所以我的问题是:
我最近的记录如何 GROUP BY from_user_id
?
答案 0 :(得分:6)
SELECT
或其他allowed functions中未列出GROUP BY
个列。这是how GROUP BY
works。
虽然大多数其他SQL风格会在这样的查询中失败,但MySQL却没有。相反,它提供任意结果 - 你所看到的。
您可以通过几种不同的方式解决这个问题。例如:
SELECT
ids 在单独查询中使用GROUP BY
的最新用户对话。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