我有 articles
表,其中包含 id
和 created_by
以及包含 id
和 name
users
表
我需要编写 SQL 来为用户 1,2,3,4,5,6,... 检索 5 篇或更少的文章
如果我使用 limit 5
,它会将结果限制为 5 条记录,但我需要将每个特定用户的结果限制为 5。
我可以使用这样的东西:
(SELECT id, created_by FROM content where created_by = 1 limit 5)
union
(SELECT id, created_by FROM content where created_by = 2 limit 5)
但我有大约 20 个用户,所以我认为效率不高。
最佳答案
您可以使用变量来模拟 ROW_NUMBER
窗口函数,这在 MySQL 中不可用:
SELECT ArticleId, UserId, UserName
FROM (
SELECT a.id AS ArticleId, u.id AS UserId, u.name AS UserName,
@row_number:= IF (@uid = u.id,
IF (@uid:=u.id, @row_number+1, @row_number+1),
IF (@uid:=u.id, 1, 1)) AS rn
FROM articles AS a
CROSS JOIN (SELECT @row_number:=0, @uid:=0) vars
INNER JOIN users AS u ON a.created_by = u.id
WHERE u.id IN (1, 2, 3, 4, 5, 6)
ORDER BY u.id, a.id ) t
WHERE t.rn <= 5
以上查询将为每个用户挑选前 5 篇文章(按照 articleId
排序)。如果用户的文章少于 5 篇,则选择该用户的所有文章。
注意嵌套条件的用法,以保证@uid
是首先读取并随后设置.
关于mysql - 以 5 组返回特定 ID 的 SQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31030423/