MySQL-如何限制基于外键的查询结果

MySQL-如何限制基于外键的查询结果,mysql,sql,database,Mysql,Sql,Database,我有一个用户表、一个帖子表和一个查询MySQL帖子的搜索功能 我希望它返回100个特定用户的所有帖子,每个用户最多6篇帖子 我在posts表中有一个名为user_id的列,它是一个外键 现在我可以像这样返回这些用户的所有帖子: SELECT id FROM posts WHERE user_id IN (1,2,3,4 .... 98,99,100); 然而,这些用户中有许多人有数百篇帖子。我想把它限制在每个用户6个。如何向查询中添加这样的约束 我正在使用MySQL 8.0.15版MySQL

我有一个用户表、一个帖子表和一个查询MySQL帖子的搜索功能

我希望它返回100个特定用户的所有帖子,每个用户最多6篇帖子

我在posts表中有一个名为user_id的列,它是一个外键

现在我可以像这样返回这些用户的所有帖子:

SELECT id FROM posts WHERE user_id IN (1,2,3,4 .... 98,99,100);
然而,这些用户中有许多人有数百篇帖子。我想把它限制在每个用户6个。如何向查询中添加这样的约束

我正在使用MySQL 8.0.15版

MySQL 8.0+可以使用:

SELECT *
FROM (
  SELECT *, ROW_NUMBER() OVER(PARTITION BY user_id ORDER BY col_time DESC) AS rn
                                                   -- taking the newest posts
  FROM posts 
  WHERE user_id IN (1,2,3,4 .... 98,99,100)
) sub
WHERE rn <= 6;
可以使用MySQL 8.0+:

SELECT *
FROM (
  SELECT *, ROW_NUMBER() OVER(PARTITION BY user_id ORDER BY col_time DESC) AS rn
                                                   -- taking the newest posts
  FROM posts 
  WHERE user_id IN (1,2,3,4 .... 98,99,100)
) sub
WHERE rn <= 6;

卢卡斯的回答很好。但是,您不需要使用行号:

注意:当用户的帖子少于6篇时,ALL将处理这种情况


有了postsuser_id,col_time的索引,我们很想知道这是比ROW_NUMBER快还是慢。

Lukasz的答案很好。但是,您不需要使用行号:

注意:当用户的帖子少于6篇时,ALL将处理这种情况


在postsuser\u id、col\u time上有一个索引,很有兴趣知道这是比ROW\u NUMBER快还是慢。

您可以使用LIMIT。@MariosNikolaou谢谢您,但我认为您没有正确理解我的问题。我知道如何限制使用limit的帖子总数。我想将每个用户的帖子数量限制为6篇。您使用的MySQL版本是什么?@TimBiegeleisen 8.0.15您可以使用limit。@MariosNikolaou谢谢,但我认为您没有正确理解我的问题。我知道如何限制使用limit的帖子总数。我想将每个用户的帖子数量限制为6篇。您使用的是什么版本的MySQL?@TimBiegeleisen 8.0.15再等一分钟,以接受这一正确答案,但这很快就奏效了。完美的这使我的查询时间从大约12秒降到了0.5秒,再花一分钟来接受这一正确答案,但这在任何时候都像一个魅力。完美的这使我的查询时间从大约12秒减少到了0.5秒