多表关联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 -- 同一赛事相同最快成绩按日期从旧到新排列
逻辑拆解:
- 子查询
nation_event_fastest:这一步是核心,通过关联times和athletes表,按nation_id(国家)和event_id(赛事)分组,用MIN(time)算出每个国家在对应赛事里的最快成绩。 - 主查询关联所有表:把
times和athletes、nations、events、courses关联起来,这样就能获取到所有需要的名称信息,而不只是ID。 - 筛选最快成绩记录:通过JOIN子查询,只保留那些成绩时间等于对应国家+赛事组合最快时间的记录,这样同一赛事里的多个相同最快成绩都会被保留。
- 排序规则:严格按照你的要求,先按赛道ID升序,再按赛事ID升序,最后对同一赛事的相同最快成绩按日期从旧到新排列。
如果需要筛选特定国家或者赛道,只要在主查询里添加WHERE条件即可,比如要查某个国家的成绩,就加WHERE n.id = ?;要查某条赛道的,就加WHERE c.id = ?。
内容的提问来源于stack exchange,提问作者Derk Jan Speelman
相关产品推荐
相关产品推荐

