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

多表关联SQL查询:按国家分组获取最快游泳成绩的实现

看起来你已经有了按运动员分组的基础查询,现在要升级到按国家分组获取最快成绩,我来帮你调整这个SQL,同时满足你提到的排序和成绩保留要求。

首先,我们需要明确核心逻辑:要找到每个国家在每个赛事中的最快时间,然后把所有符合这个最快时间的成绩记录都捞出来,同时关联上所有需要的表信息(国家、运动员、赛道、赛事),最后按规则排序。

下面是完整的SQL查询:

SELECT 
    n.name AS nation_name,
    a.name AS athlete_name,
    c.name AS course_name,
    e.name AS event_name,
    t.time,
    t.date
FROM times t
JOIN athletes a ON t.athlete_id = a.id
JOIN nations n ON a.nation_id = n.id
JOIN events e ON t.event_id = e.id
JOIN courses c ON e.course_id = c.id
JOIN (
    -- 子查询:计算每个国家在每个赛事中的最快成绩
    SELECT 
        a_inner.nation_id, 
        t_inner.event_id, 
        MIN(t_inner.time) AS fastest_time
    FROM times t_inner
    JOIN athletes a_inner ON t_inner.athlete_id = a_inner.id
    GROUP BY a_inner.nation_id, t_inner.event_id
) AS nation_event_fastest 
    ON a.nation_id = nation_event_fastest.nation_id
    AND t.event_id = nation_event_fastest.event_id
    AND t.time = nation_event_fastest.fastest_time
ORDER BY 
    c.id ASC,  -- 先按赛道ID排序
    e.id ASC,  -- 再按赛事ID排序
    t.date ASC -- 同一赛事相同最快成绩按日期从旧到新排列

逻辑拆解:

  1. 子查询nation_event_fastest:这一步是核心,通过关联times和athletes表,按nation_id(国家)和event_id(赛事)分组,用MIN(time)算出每个国家在对应赛事里的最快成绩。
  2. 主查询关联所有表:把times和athletes、nations、events、courses关联起来,这样就能获取到所有需要的名称信息,而不只是ID。
  3. 筛选最快成绩记录:通过JOIN子查询,只保留那些成绩时间等于对应国家+赛事组合最快时间的记录,这样同一赛事里的多个相同最快成绩都会被保留。
  4. 排序规则:严格按照你的要求,先按赛道ID升序,再按赛事ID升序,最后对同一赛事的相同最快成绩按日期从旧到新排列。

如果需要筛选特定国家或者赛道,只要在主查询里添加WHERE条件即可,比如要查某个国家的成绩,就加WHERE n.id = ?;要查某条赛道的,就加WHERE c.id = ?。

内容的提问来源于stack exchange,提问作者Derk Jan Speelman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:39:50