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

如何在mysql查询中从每个组中选择多个项目?,mysql,group-by,greatest-n-per-group,Mysql,Group By,Greatest N Per Group,我有一些论坛数据的形式 帖子(作者、线程id、文本) 对于每个作者,我想选择与该作者相关联的10个不同的thread_id(可能有10个以上,并且数量因作者而异) 我正在考虑使用GROUP BY对“author”进行分组,但我不知道如何表示每个组的限制,以及如何将每个组重新展开为10行。下面是一个解决“每组前N名”类型查询的方法 请注意,您必须为给定作者选择10个线程。在本例中,我假设您需要最新的线程(线程id是一个自动递增的值),对于领带的情况,您有一个主键posts.post\u id SE

我有一些论坛数据的形式

帖子(作者、线程id、文本)

对于每个作者,我想选择与该作者相关联的10个不同的thread_id(可能有10个以上,并且数量因作者而异)

我正在考虑使用GROUP BY对“author”进行分组,但我不知道如何表示每个组的限制,以及如何将每个组重新展开为10行。

下面是一个解决“每组前N名”类型查询的方法

请注意,您必须为给定作者选择10个线程。在本例中,我假设您需要最新的线程(线程id是一个自动递增的值),对于领带的情况,您有一个主键
posts.post\u 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;
选择p1*
从柱p1到左外连接柱p2
ON(p1.author=p2.author)和(p1.thread\u id

如果您在评论中提出了后续问题,请解释如下:

在每个作者的前10个线程中,我们可以说,对于这些线程中的每一个,该作者属于结果集的其他线程都有9个或更少。因此,对于每个作者的帖子(p1),我们计算有多少来自同一作者的帖子(p2)具有更大的线程。如果该计数小于10,则该作者的帖子(p1)属于结果


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

谢谢,这很有用。我还没有完全理解思考的过程,请您详细说明一下它是如何工作的好吗?