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

时间:2014-05-10 16:28:04

标签: 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

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

1 个答案:

答案 0 :(得分:1)

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.依此类推。