SQL多表关联查询:按关联系列最早开始时间排序竞赛列表
按竞赛关联的最早系列日期排序竞赛列表的解决方案
我来帮你搞定这个需求!结合你给出的三张表结构,要获取竞赛列表并按每个竞赛下最早series的start_date排序,这里有两种实用的SQL写法:
方法1:分组聚合获取最早日期(通用型,适配大多数数据库)
这种写法兼容性强,几乎所有关系型数据库都支持:
SELECT c.ID, c.Title, MIN(s.start_date) AS earliest_series_date FROM contests c LEFT JOIN contest_series cs ON c.ID = cs.contest_id LEFT JOIN series s ON cs.series_id = s.ID GROUP BY c.ID, c.Title ORDER BY earliest_series_date ASC;
方法2:窗口函数写法(适用于支持窗口函数的数据库,如MySQL 8+、PostgreSQL、SQL Server等)
如果你的数据库支持窗口函数,这种写法逻辑更直观,不需要分组:
SELECT DISTINCT c.ID, c.Title, FIRST_VALUE(s.start_date) OVER ( PARTITION BY c.ID ORDER BY s.start_date ASC ) AS earliest_series_date FROM contests c LEFT JOIN contest_series cs ON c.ID = cs.contest_id LEFT JOIN series s ON cs.series_id = s.ID ORDER BY earliest_series_date ASC;
关键逻辑说明
- 用
LEFT JOIN关联三张表:确保即使某个竞赛没有关联任何series(实际场景可能存在这种情况),也能被保留在结果里;如果确定所有竞赛都有对应的series,换成INNER JOIN也可以。 - 方法1中,
GROUP BY c.ID, c.Title按竞赛分组,MIN(s.start_date)直接计算每个竞赛对应的最早系列开始日期。 - 方法2中,
PARTITION BY c.ID按竞赛划分窗口,ORDER BY s.start_date ASC让窗口函数取每组里最早的日期,DISTINCT用来去重(因为一个竞赛可能对应多个series,会产生多行重复的竞赛记录)。 - 最后通过
ORDER BY earliest_series_date ASC实现按最早日期升序排序,要是需要降序,把ASC改成DESC就行。
内容的提问来源于stack exchange,提问作者Phil
相关产品推荐
相关产品推荐

