mysql - 如何为 MySQL 中的每个唯一列值获取 x 行数?

标签 mysql

我有一个非常简单的表,这里是值。

id      photo_name      user_id     created_at
----------------------------------------------
144     Photo1          1           2014-05-01 09:30:15
143     Photo2          2           2014-05-01 10:30:15
142     Photo3          1           2014-05-01 11:30:15
141     Photo4          3           2014-05-01 12:30:15
140     Photo5          1           2014-05-01 13:30:15
139     Photo6          2           2014-05-01 14:30:15
139     Photo6          2           2014-05-01 14:30:15

预期结果

我想限制每个user_id 2张照片

id      photo_name      user_id     created_at
----------------------------------------------
144     Photo1          1           2014-05-01 11:30:15
142     Photo3          1           2014-05-01 12:30:15
143     Photo2          2           2014-05-01 13:30:15
139     Photo6          2           2014-05-01 14:30:15
141     Photo4          3           2014-05-01 14:30:15

我已经尝试了几种方法,但无法得到想要的结果。提前感谢您的帮助!

最佳答案

在 MySQL 中最简单的方法是使用变量:

select id, photo_name, user_id, created_at
from (select p.*,
             @rn := if(@uid = user_id, @rn + 1, 1) as rn,
             @uid := user_id
      from photos p cross join
           (select @uid := -1, @rn := 0) var
      order by user_id
     ) p
where rn <= 2;

还有另一种使用标准 SQL 的方法:

select p.*
from photos p
where 2 >= (select count(*)
            from photos p2
            where p2.user_id = p.user_id and
                  p2.id <= p.id
           );

子查询的作用是计算给定用户的照片数量。 p2.user_id = p.user_id将查询限制为仅用户。 p2.id <= p.id下订单。所以最低id因为用户只有一个匹配项(本身)并且计数为 1 .接下来有两个匹配项——最低的和它本身——所以值为 2。依此类推。

关于mysql - 如何为 MySQL 中的每个唯一列值获取 x 行数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23583573/

相关文章:

MySQL - 生成的行号不连续

mysql - 全短语优先搜索

MySQL SELECT 编码问题(可能是西里尔文)

mysql - 对于一个巨大的非分布式数据库,将大表分区成多个表不是仍然有意义吗?

MySQL:根据一行的值获取多行

mysql - 连接表上的索引是否用于多对多关系?

php - 创建新的 html 表,按年,根据年降序变化

mysql - 如何在Cloud Foundry App中将mysql添加到新的遗迹监控中

mysql - 应针对列的前 3 个字符处理“like”子句

mysql - Git + 数据库自动生成脚本