2012-01-13 105 views
2

这里是我的代码:SQL 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由最近的记录?

+0

的数据库软件? – 2012-01-13 18:52:02

+0

刚刚重新绑定了MySQL。由于包含PHP代码中的'mysql_query'语句,并且因为只有MySQL允许您以这种方式滥用GROUP BY语义,所以它必须是。 :S – 2012-01-13 18:53:01

+0

按from_user_id分组意味着无论涉及多少个对话,该用户的帖子都会有一个行输出。您的表是否有对话ID字段? – 2012-01-13 18:56:33

回答

1

尝试用这种

SELECT *,MAX(id) as OrderField FROM messages WHERE to_user_id = '$user_id' 
GROUP BY from_user_id 
ORDER BY OrderField DESC,read 
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中的分组记录中获取特定的值子集。

6

您不能SELECT列未在GROUP BY或其他allowed functions列出。这是how GROUP BY works

尽管大多数其他SQL风格在这样的查询上会失败,但MySQL不会。相反,它提供任意结果 - 你所看到的。

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

  • SELECTIDS在一个单独的查询中使用GROUP BY最新的用户会话的
  • 通过子选择IDJOIN这一组ID来完成一个查询。