group by,order by,with join

时间:2010-04-15 02:10:28

标签: mysql

嘿伙计们,快速问题,我有这个查询,我正在尝试获取每个主题的最新评论,然后按降序排序这些结果(因此每个主题一个评论)。我有我认为应该工作的东西,但我的加入总是让我的结果变得混乱。不知何故,它似​​乎已经正确地对最终结果进行了排序,但没有从每个主题中获取最新评论,而是似乎只是随机评论。如果有人有任何想法,会非常感谢任何建议

SELECT * FROM comments 
JOIN topic ON topic.topic_id=comments.topic_id 
WHERE topic.creator='admin' 
GROUP BY comments.topic_id 
ORDER BY comments.time DESC

表评论的结构类似于 id time用户消息topic_id


表格主题的结构类似于 topic_id subject_id topic_title创建者时间戳描述

3 个答案:

答案 0 :(得分:5)

你在这里发生了一些事情。首先,您当前查询返回奇怪结果的原因是您没有按照预期的方式使用GROUP BY子句;它旨在与聚合字段一起使用(如COUNT(),SUM()等)。这是一个方便的副作用,在MySQL上,GROUP BY子句还返回组中的第一条记录 - 在您的情况下,应该是每个主题的第一次插入消息(不是随意的)。因此,您编写的查询实际上是返回每个主题最旧的消息(仅在MySql上;请注意,如果您尝试使用类似的GROUP BY子句,其他RDBMS将抛出错误!)

但你实际上可以滥用GROUP BY子句来获得你想要的东西,而你已经非常接近了。你需要做的是先做一个子查询来制作一个派生表(你的消息按DESC日期排序),然后使用GROUP BY子句查询派生表,如下所示:

select * from (
  SELECT
    topic.topic_title, comments.id, comments.topic_id, comments.message
  FROM comments
  JOIN topic ON topic.topic_id=comments.topic_id
  WHERE topic.creator='admin'
  order by comments.time desc) derived_table
group by topic_id

答案 1 :(得分:2)

这是MySQL中标准SQL的扩展,我认为它根本没有帮助。在标准SQL中,根本不允许使用您的命令,因为无法确定哪个单行应该作为GROUP BY的结果报告。 MySQL将执行此命令(如您所知)返回的随机行。

您可以在此处查看此问题的讨论:MySQL - Control which row is returned by a group by

答案 2 :(得分:-1)

如果您尝试获取最新评论,则应为ORDER BY comments.time DESC LIMIT 1。我怀疑这会解决你的问题。