2015-11-08 58 views
1

我已经搜索了很多关于这个不同的帖子,我没有找到适合我的东西。MySQL限制行/分组由

Using LIMIT within GROUP BY to get N results per group?http://www.sqlines.com/mysql/how-to/get_top_n_each_group没有为我工作。

我有一个简单的MySQL表有以下的列

id , package, user_id, date 

我想执行一个查询中,我会得到

X行/ USER_ID其中date>号码顺序按日期ASC

总之,我们想要执行一个Group By user_idLIMIT of X rows/group,但要记住使用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 

从我们希望只选择2行/ USER_ID但是其中日期> = 1447000031(但要ORDER BY date ASC第一)

期望输出上表

4, full, 1 , 1447001013 
3, full, 1 , 1447002022 
9, mid, 2 , 1447001013 
8, mid, 2 , 1447002022 
+0

所以,你想有每个用户超过1行? –

+0

示例表和结果plz – Steve

+1

'that date> Number'? –

回答

3

例如:

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; 

,或者更快,但更多的输入...

SELECT id 
    , package 
    , user_id 
    , date 
    FROM 
    (SELECT x.* 
      , CASE WHEN @prev_user = user_id THEN @i:[email protected]+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; 
+0

好的SQL!你可以在这里查看:http://sqlfiddle.com/#!9/593f5 –

+0

另外,如果你可以格式化第二个解决方案,那么WHERE rank <= 2是代码块内的。 –