mysql - 使用双 GROUP BY 时获取 MIN()

标签 mysql group-by left-join min

我遇到了多个 JOINS 的棘手情况,我有点卡住了。让我详细说明一下。

我有这些表:

比赛

id | system_id | track | race_name | race_date
----------------------------------------------
1  | 3         | Track1| Name      | 2016-10-07
2  | 5         | Track1| Name      | 2016-10-08
3  | 6         | Track1| Name      | 2016-10-09

赛车手

id | system_id | racer_name | gender | bday      | from | laps_completed
------------------------------------------------------------------------
1  | 10002     | Name1      | 1      | 1996-10-07|Place | 14
2  | 10003     | Name2      | 0      | 1996-10-08|Place2| 33
3  | 10004     | Name3      | 1      | 1996-10-09|Place3| 44

RACERS_RACES

id | race_id | racer_id
-----------------------
1  | 3       | 10002 
2  | 5       | 10004
3  | 6       | 10003 

圈数

id | lap_time | system_id | racer_id
------------------------------------
1  | 25.33    | 1         | 10002
2  | 23.11    | 3         | 10003
3  | 28.55    | 7         | 10004

我尝试过执行此查询:

    SELECT r.system_id,MIN(l.lap_time) as fastest_lap,ra.racer_name,ra.racer_from,r.race_name,ra.laps_completed,r.race_date 
FROM races r 
LEFT JOIN racers_races rr ON r.system_id=rr.race_id 
LEFT JOIN racers ra ON rr.racer_id=ra.system_id 
LEFT JOIN laps l ON ra.system_id=l.racer_id 
WHERE l.lap_time!=0 
GROUP BY r.system_id,l.racer_id 
ORDER BY l.lap_time ASCenter code here

我的问题是,当我有多个赛车手时,我在不同的比赛中拥有相同的最快圈速,但不应该是这样。它应该返回我在某场比赛中赛车手的最快圈速。

这是一个sqlfiddle链接。

最佳答案

MIN 和“双分组依据”不是问题。

您似乎缺少连接条件。看起来与laps的连接应该包括与特定races的匹配。我只看到给定赛车手的加入条件。

如果laps中有一个race_id列,则如下所示:

  ...
  LEFT JOIN laps l 
         ON l.racer_id = ra.system_id
        AND l.race_id  = rr.race_id
  WHERE l.lap_time != 0
  ...

对我来说,看起来我们确实希望将 laps 中的连接加入到 racers_races 表中。单圈时间不取决于赛车手...它取决于赛车手和比赛...赛车手参加比赛。

如果无法将 lapsracers_races 中的特定行相匹配,则架构存在问题。

另一种可能性(当然)是架构是正确的。该查询只会返回赛车手的最快圈速,因此该查询将为每个比赛返回给定赛车手的相同最快时间。

<小时/>

另请注意,WHERE 子句中的条件否定了 LEFT JOIN 的外部性。如果您确实希望它成为“外部”连接,则将该条件移至 ON 子句

  ...
  LEFT JOIN laps l 
         ON l.racer_id = ra.system_id
        AND l.<race_id> = rr.race_id
        AND l.lap_time != 0
  WHERE 1=1
  ... 

关于mysql - 使用双 GROUP BY 时获取 MIN(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41558226/

相关文章:

mysql - 如何为外键添加约束,使其依赖于表 FK 来自的列的值?

mysql - 如何使用mysql在给定日期中按另一列查找列组

sql - 使用 group by 时出错

sql-server - T-SQL 是否有用于连接字符串的聚合函数?

sql - 外键列可以为NULL的查询

两列之间的Mysql datetime

apache-spark - Pyspark 数据帧 : how to apply scipy. 按组优化功能

mySQL 查询 LEFT OUTER JOIN 不显示 null

mysql - 具有大量 LEFT JOINS 的 SQL 查询

php - 创建调度程序应用程序 - 过程和概念问题