MySQL为每个类别选择前N行

时间:2017-02-24 17:39:33

标签: mysql

我正在尝试从每个类别获得前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;

2 个答案:

答案 0 :(得分:3)

这对MySQL来说更是一种痛苦。可能最简单的方法是使用变量:

requires

答案 1 :(得分:-1)

我会选择这样的东西:

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

我的mySql技能有点生疏,但这个(或它的概念)应该可以解决问题。