我有一个非常简单的表,这里是值。
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/