如何在mysql查询中从每个组中选择多个项目?

时间:2009-08-20 07:48:31

标签: mysql group-by greatest-n-per-group

我有一些表格

的论坛数据

发布(作者,thread_id,文本)

对于每位作者,我想选择与该作者相关的10个不同的thread_id(可能超过10个,并且编号因作者而异)。

我正在考虑使用GROUP BY对'author'进行分组,但我无法理解如何在每个组中表达LIMIT,以及如何将每个组扩展回10行。

1 个答案:

答案 0 :(得分:6)

这是“每组前N个”类型查询的解决方案。

请注意,您必须为所需的给定作者选择哪个 10个主题。对于这个例子,我假设你想要最新的线程(而thread_id是一个自动增量值),对于tie的情况,你有一个主键posts.post_id

SELECT p1.*
FROM post p1 LEFT OUTER JOIN post p2
 ON (p1.author = p2.author AND (p1.thread_id < p2.thread_id 
   OR p1.thread_id = p2.thread_id AND p1.post_id < p2.post_id))
GROUP BY p1.author
HAVING COUNT(*) < 10;

在评论中重新提出您的后续问题,以下是解释:

在每位作者的前10个主题中,我们可以说对于每个主题,属于该结果集的该作者有9个或更少的其他主题。因此,对于每个作者的帖子(p1),我们计算同一作者有多少帖子(p2)有更多的帖子。如果该计数小于10,则该作者的帖子(p1)属于结果。

我添加了一个术语来解决与post_id的关系。