You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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科技前沿12024-06-01 14:30:0011
2科技前沿22024-05-31 10:15:0011
3科技前沿32024-05-30 09:00:0011
4日常技巧12024-06-01 16:45:0022
5日常技巧22024-05-31 13:20:0022
6日常技巧32024-05-30 11:10:0022

预期结果

帖子ID帖子标题发布时间类别ID父类别ID
1科技前沿12024-06-01 14:30:0011
2科技前沿22024-05-31 10:15:0011
4日常技巧12024-06-01 16:45:0022
5日常技巧22024-05-31 13:20:0022

修改后的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 21:40:21