如何分组和限制一个字段的n个结果?

5m1hhzi4  于 2021-06-24  发布在  Mysql
关注(0)|答案(3)|浏览(325)

在mysql中我有文章。每篇文章都有分类。我要按日期从每个类别中得到最后n篇文章。如何在sql中实现这一点?还对如何将其转换为yii2活动查询感兴趣。
示例:10篇文章,3个类别。类别 A 有2篇文章,分类 B 有3篇文章,分类 C 有5篇文章。
带查询like

SELECT *
FROM articles
GROUP BY 'category'
LIMIT 2
ORDER BY 'date'

我得从你那儿弄两篇文章 A ,来自的最后两篇文章 B 最后两篇文章 C

dzhpxtsq

dzhpxtsq1#

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

--(FOR MSSQL)
    select emp_no , sum(salary_amount) from emp_salary
    Group by emp_no 
    ORDER BY emp_no 
    OFFSET 0 ROWS       -- Skip first 5 
    FETCH NEXT 2 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 0, 2
fkvaft9z

fkvaft9z2#

使用子查询。嵌套的select语句将获取按a1项目类别分组、按日期排序且限制为2的项目ID。

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的旧版本。不过,它在甲骨文上会有用的。

cbwuti44

cbwuti443#

一种方法是:

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 . 不知道为什么,但它确实适用于比较运算符。

相关问题