SQL查询需求:获取各博客分类下最新4篇博客
按分类获取最新4篇博客的SQL实现
适用支持窗口函数的数据库(MySQL 8+、PostgreSQL、SQL Server等)
使用ROW_NUMBER()窗口函数可以高效实现每个分类取最新4篇的需求,同时保留两张表的关联:
SELECT b.*, bc.* FROM ( SELECT *, -- 按分类分组,每组内按发布日期降序编号 ROW_NUMBER() OVER (PARTITION BY blog_category ORDER BY blog_posting_date DESC) AS row_num FROM blogs ) b INNER JOIN blog_categories bc ON b.blog_category = bc.category_id -- 筛选每个分类的前4条最新记录 WHERE b.row_num <= 4 -- 按分类ID、发布日期降序排序结果 ORDER BY bc.category_id, b.blog_posting_date DESC;
适用不支持窗口函数的旧版数据库(如MySQL 5.x)
如果你的数据库不支持窗口函数,可以用关联子查询的方式实现:
SELECT b.*, bc.* FROM blogs b INNER JOIN blog_categories bc ON b.blog_category = bc.category_id WHERE ( -- 统计同分类下发布时间晚于等于当前博客的数量 SELECT COUNT(*) FROM blogs b2 WHERE b2.blog_category = b.blog_category AND b2.blog_posting_date >= b.blog_posting_date ) <= 4 ORDER BY bc.category_id, b.blog_posting_date DESC;
说明
- 由于
blogs.blog_category是关联blog_categories.category_id的外键,已经天然保证了每篇博客属于其关联的分类,无需额外添加验证条件。 - 两种方法都会返回所有分类下的最新4篇博客,替代了你原来仅查询分类ID为1的逻辑。
内容的提问来源于stack exchange,提问作者Ranish Kumar
相关产品推荐
相关产品推荐

