mysql - 以 5 组返回特定​​ ID 的 SQL

标签 mysql sql

我有 articles 表,其中包含 idcreated_by 以及包含 idname

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首先读取并随后设置.

Demo here

关于mysql - 以 5 组返回特定​​ ID 的 SQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31030423/

相关文章:

mysql - 无法添加外键约束

c# - 在文本框中显示 SQL 表的查询

sql - SELECT 有优惠条件

php - 在 sql 中使用 Order By 和三个 UNION

php - 如何通过php更改mysql分隔符

MySQL:更改主键的 ID

mysql - VirtueMart 自定义字段 (SKU)

mysql - 从数据库中获取每日销售额

SQL 将 'DDMMYY' 转换为日期时间

sql - WiX:你如何更新数据库?