簡體   English   中英

MySQL為每個類別選擇前N行

[英]MySQL select top N rows for each category

我正在嘗試從每個類別中獲取最新的前2行,並且可以在以后進行縮放,因此,例如,我可以獲取前4行而不是前2行。

這是我的桌子的樣子

  Id   | category_id | created_at
------ | -----------   ----------
   1   |      1      | 2017-12-01
   2   |      2      | 2017-12-02
   3   |      4      | 2017-12-03
   4   |      2      | 2017-12-04
   5   |      1      | 2017-12-05
   6   |      1      | 2017-12-06
   7   |      3      | 2017-12-07
   8   |      4      | 2017-12-08
   9   |      4      | 2017-12-09
   10  |      3      | 2017-12-10
   11  |      5      | 2017-12-11

我想獲取最新的2行(基於created_at列)ID,所以我希望輸出類似於

      Ids     
    ------ 
       5   
       6   
       2   
       4   
       7
       10
       8
       9
       11

我正在做類似的事情

select * from table
inner join (
    select * from table
    order by category_id, created_at
    limit 2
) as tb
on tb.id = table.id and tb.category_id = table.category_id

顯然它沒有用,只是想分享我到目前為止所取得的成就。 有沒有辦法在MySQL中做到這一點?

編輯

我實際上是這樣做的,這有點奏效

SELECT *
   FROM
     (SELECT *, 
                  @count := IF(@current_category = category_id, @count + 1, 1) AS count,
                  @current_category := category_id 
       FROM table
       ORDER BY category_id, created_at DESC
     ) ranked
   WHERE count <= 2;

在MySQL中,這比應有的要痛苦得多。 可能最簡單的方法是使用變量:

select t.*
from (select t.*,
             (@rn := if(@c = category_id, @rn + 1,
                        if(@c := category_id, 1, 1)
                       )
             ) as rn
      from t cross join
           (select @rn := 0, @c := -1) params
      order by category_id, created desc
     ) t
having rn <= 2;

我會選擇這樣的東西:

select * from table group by category_id order by created_at limit 2

我的mySql技能有點生銹,但這(或它的概念)應該可以解決問題。

暫無
暫無

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

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