2015-11-08 88 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是代碼塊內的。 –