在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篇文章
答案 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