我有一个非常简单的表,这里是值。
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
我尝试了几种方法,但无法获得理想的结果。提前感谢您的帮助!
答案 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.依此类推。