如何选择wach user_id的行等于为每个user_id选择计数的数量?

我的示例表:

mp3_id  |  user_id
--------------------
120     |  840
123     |  840
126     |  840
128     |  455
130     |  840
131     |  840
132     |  840
135     |  840
144     |  840
158     |  840
159     |  455
161     |  455
169     |  455
180     |  840
181     |  455
184     |  455
186     |  455
189     |  455


我的简单查询:

select mp3_id where user_id IN (840,455) limit 8

恢复:

mp3_id  |  user_id
--------------------
120     |  840
123     |  840
126     |  840
128     |  455
130     |  840
131     |  840
132     |  840
135     |  840


但我要选择:

mp3_id  |  user_id
--------------------
120     |  840
123     |  840
126     |  840
130     |  840
128     |  455
159     |  455
161     |  455
169     |  455


我想为每个user_id返回相等的行数。如何?谢谢

最佳答案

SELECT x.*
  FROM my_table x
  JOIN my_table y
    ON y.user_id = x.user_id
   AND y.mp3_id <= x.mp3_id
 GROUP
    BY x.mp3_id HAVING COUNT(*) <= 4
 ORDER
    BY user_id DESC
     , mp3_id;


或更快

SELECT mp3_id, user_id FROM
 (
 SELECT x.*, CASE WHEN @prev = user_id THEN @i:=@i+1 ELSE @i:=1 END i, @prev:=user_id FROM my_table x, (SELECT @prev:=null,@i:=1) vars ORDER BY user_id DESC, mp3_id
 ) a
 WHERE i<=4;

10-05 19:31