我搜索了很多关于此的不同帖子,但没有找到适合我的东西。
这在 GROUP BY 中使用 LIMIT 来获得每组 N 个结果?和http://www.sqlines.com/mysql/how-to/get_top_n_each_group对我不起作用。
我有一个简单的 MySQL 表,其中包含以下列
id , package, user_id, date
Run Code Online (Sandbox Code Playgroud)
我想执行一个查询,我将得到
X 行 / user_id WHERE 日期 > 编号 按日期 ASC 排序
简而言之,我们想要执行Group By user_idwithLIMIT of X rows / group但要记住使用 the 的语句date column
全表示例:
id , package, user_id, date
1, full, 1 , 1447003159
2, full, 1 , 1447003055
3, full, 1 , 1447002022
4, full, 1 , 1447001013
5, full, 1 , 1447000031
6, mid, 2 , 1447003159
7, mid, 2 , 1447003055
8, mid, 2 , 1447002022
9, mid, 2 , 1447001013
10, mid, 2 , 1447000031
Run Code Online (Sandbox Code Playgroud)
从上表中,我们只想选择 2 行 / user_id 但其中 date >= 1447000031 (但ORDER BY date ASC首先要这样做)
预期输出:
4, full, 1 , 1447001013
3, full, 1 , 1447002022
9, mid, 2 , 1447001013
8, mid, 2 , 1447002022
Run Code Online (Sandbox Code Playgroud)
例如:
SELECT x.*
FROM my_table x
JOIN my_table y
ON y.id >= x.id
AND y.user_id = x.user_id
WHERE y.date > 1447000031
GROUP
BY x.id
HAVING COUNT(*) <= 2;
Run Code Online (Sandbox Code Playgroud)
或者,更快,但打字更多......
SELECT id
, package
, user_id
, date
FROM
( SELECT x.*
, CASE WHEN @prev_user = user_id THEN @i:=@i+1 ELSE @i:=1 END rank
, @prev_user := user_id
FROM my_table x
, ( SELECT @prev_user = 0,@i:=1 ) vars
WHERE date > 1447000031
ORDER
BY user_id
, date
) a
WHERE rank <= 2;
Run Code Online (Sandbox Code Playgroud)