如何从一个字段中获得GROUP BY和LIMIT N的结果?

时间:2018-04-12 07:19:49

标签: mysql sql yii2

在MySQL中我有文章。每篇文章都有类别。我想从按日期排序的每个类别中获取最后N篇文章。如何在SQL中执行此操作?也有兴趣如何将其转换为Yii2 Active Query。

示例:10篇文章,3个类别。类别A有2篇文章,类别B有3篇文章,类别C有5篇文章。

使用

之类的查询
SELECT *
FROM articles
GROUP BY 'category'
LIMIT 2
ORDER BY 'date'

我必须从A获得2篇文章,从B获得2篇文章,从C获得2篇文章

3 个答案:

答案 0 :(得分:1)

使用子查询。嵌套的SELECT语句将获取按a1文章类别分组的文章ID,按日期排序并限制为2.

SELECT * FROM articles a1
WHERE a1.id IN 
  (SELECT a2.id FROM articles a2 
   WHERE a1.category = a2.category 
   ORDER BY ctime desc LIMIT 2)
ORDER BY a1.category, a1.ctime;

注意: 此代码不适用于旧版本的MySQL。它可以在Oracle上运行。

答案 1 :(得分:1)

一种方法是:

select a.*
from articles a
where a.ctime >= coalesce((select a2.ctime
                           from articles a2
                           where a2.category = a.category
                           order by a2.ctime desc
                           limit 1, 1
                          ), a.ctime
                         );

MysQL不允许in具有limit的相关子查询。不知道为什么,但它确实适用于比较运算符。

答案 2 :(得分:0)

试试这个。这是最好的例子。

--(FOR MSSQL)
    select emp_no , sum(salary_amount) from emp_salary
    Group by emp_no 
    ORDER BY emp_no 
    OFFSET 5 ROWS       -- Skip first 5 
    FETCH NEXT 10 ROWS ONLY; -- limit to retrieve next 10 row after skip

--(For MYSQL)
    select emp_no , sum(salary_amount) from emp_salary
    Group by emp_no 
    ORDER BY emp_no 
    limit 1, 1