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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:41:45