如何编写SQL语句获取关联最新内容的5个唯一子分类?
解决方案:筛选最新的5个关联子分类
核心思路
通过content_subcategories中间表关联Subcategories与Content表,先获取每个子分类关联内容的最新创建时间,以此为排序依据,筛选出前5个不重复的子分类。
示例SQL语句
SELECT DISTINCT s.subcategory_id, s.subcategory_name, MAX(c.created_at) AS latest_content_time FROM Subcategories s JOIN content_subcategories cs ON s.subcategory_id = cs.subcategory_id JOIN Content c ON cs.content_id = c.content_id GROUP BY s.subcategory_id, s.subcategory_name ORDER BY latest_content_time DESC LIMIT 5;
语句说明
JOIN操作:借助中间表content_subcategories建立子分类与内容的关联,确保能获取子分类对应的所有关联内容。MAX(c.created_at):计算每个子分类下关联内容的最新创建时间,作为排序的核心依据。GROUP BY s.subcategory_id, s.subcategory_name:按子分类唯一标识分组,确保每个子分类仅返回一条结果(配合DISTINCT双重保障去重,也可仅依赖GROUP BY实现去重)。ORDER BY latest_content_time DESC:按最新内容时间倒序排列,优先展示关联了最新内容的子分类。LIMIT 5:仅保留前5条结果,满足需求数量。
替代写法(适用于特定场景)
如果需要更精准地基于单条最新内容关联子分类,可使用子查询先筛选内容的最新记录:
SELECT DISTINCT s.subcategory_id, s.subcategory_name, c.created_at AS latest_content_time FROM Subcategories s JOIN content_subcategories cs ON s.subcategory_id = cs.subcategory_id JOIN ( SELECT content_id, created_at FROM Content ORDER BY created_at DESC ) c ON cs.content_id = c.content_id ORDER BY c.created_at DESC LIMIT 5;
注意:第二种写法在数据量较大时性能可能不如第一种,因为子查询需先排序所有内容记录,建议优先使用分组取最大时间的方案。
内容的提问来源于stack exchange,提问作者Mit Patel
相关产品推荐
相关产品推荐

