如何在SQL查询中按类别限制结果,每个类别最多2条帖子
解决轮播帖子按类别限制返回数量的SQL修改方案
现有SQL
SELECT p.id, p.title, p.post_date, c.category_id, c.parent_category_id FROM posts p INNER JOIN categories c ON p.category_id = c.category_id WHERE c.parent_category_id != 3 ORDER BY p.post_date DESC;
表结构
posts表
id: 帖子唯一标识(主键)title: 帖子标题post_date: 帖子发布时间category_id: 关联的类别ID(外键)
categories表
category_id: 类别唯一标识(主键)parent_category_id: 父类别ID
当前结果
| 帖子ID | 帖子标题 | 发布时间 | 类别ID | 父类别ID |
|---|---|---|---|---|
| 1 | 科技前沿1 | 2024-06-01 14:30:00 | 1 | 1 |
| 2 | 科技前沿2 | 2024-05-31 10:15:00 | 1 | 1 |
| 3 | 科技前沿3 | 2024-05-30 09:00:00 | 1 | 1 |
| 4 | 日常技巧1 | 2024-06-01 16:45:00 | 2 | 2 |
| 5 | 日常技巧2 | 2024-05-31 13:20:00 | 2 | 2 |
| 6 | 日常技巧3 | 2024-05-30 11:10:00 | 2 | 2 |
预期结果
| 帖子ID | 帖子标题 | 发布时间 | 类别ID | 父类别ID |
|---|---|---|---|---|
| 1 | 科技前沿1 | 2024-06-01 14:30:00 | 1 | 1 |
| 2 | 科技前沿2 | 2024-05-31 10:15:00 | 1 | 1 |
| 4 | 日常技巧1 | 2024-06-01 16:45:00 | 2 | 2 |
| 5 | 日常技巧2 | 2024-05-31 13:20:00 | 2 | 2 |
修改后的SQL
SELECT id, title, post_date, category_id, parent_category_id FROM ( SELECT p.id, p.title, p.post_date, c.category_id, c.parent_category_id, -- 按类别分组,按发布时间倒序生成序号 ROW_NUMBER() OVER (PARTITION BY c.category_id ORDER BY p.post_date DESC) AS row_rank FROM posts p INNER JOIN categories c ON p.category_id = c.category_id WHERE c.parent_category_id != 3 ) AS ranked_posts -- 筛选每个类别前2条帖子 WHERE row_rank <= 2 ORDER BY post_date DESC;
方案说明
- 利用
ROW_NUMBER()窗口函数,按category_id分组,为每个类别下的帖子按发布时间倒序分配序号 - 外层查询仅保留序号≤2的记录,实现每个类别最多返回2条最新帖子
- 保留原逻辑:排除父类别ID为3的内容,最终结果仍按发布时间倒序排列
内容的提问来源于stack exchange,提问作者Adriano
相关产品推荐
相关产品推荐

