簡體   English   中英

MySQL每組前2條記錄

[英]MySQL top 2 records per group

基本上,考慮到最后的created_datetime,我只需要為每個用戶獲取最后的2條記錄:

id | user_id | created_datetime
1  | 34      | '2015-09-10'
2  | 34      | '2015-10-11'
3  | 34      | '2015-05-23'
4  | 34      | '2015-09-13'
5  | 159     | '2015-10-01'
6  | 159     | '2015-10-02'
7  | 159     | '2015-10-03'
8  | 159     | '2015-10-06'

返回(預期輸出):

2  | 34      | '2015-10-11'
1  | 34      | '2015-09-10'
7  | 159     | '2015-10-03'
8  | 159     | '2015-10-06'

我正在嘗試這個想法:

select user_id, created_datetime, 
$num := if($user_id = user_id, $num + 1, 1) as row_number, 
$id := user_id as dummy 
from logs group by user_id 
having row_number <= 2 

想法是僅保留這些前2行,並刪除所有其他行。

有任何想法嗎?

你的想法很接近。 我認為這會更好:

select u.*
from (select user_id, created_datetime, 
             $num := if(@user_id = user_id, @num + 1,
                        if(@user_id := id, 1, 1)
                       ) as row_number
      from logs cross join
           (select @user_id := 0, @num := 0) params
      order by user_id 
     ) u
where row_number <= 2 ;

更改如下:

  • 僅在一個表達式中設置變量。 MySQL不保證表達式求值的順序,因此這很重要。
  • 該工作在子查詢中完成,然后在外部查詢中進行處理。
  • 子查詢使用order by而不是group by
  • 外查詢使用where的,而不是having (實際上,在MySQL中having一定的作用,但where是比較合適)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM