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