使用双GROUP BY时获取MIN()

时间:2017-01-09 22:42:19

标签: mysql group-by left-join min

我有多个JOINS这种棘手的情况,我有点卡住了。让我详细说明。

我有这些表格:

种族

<div class='title'>
  <p>Jordan Matthews</p>
  </div>

RACERS

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

RACERS_RACES

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

LAPS

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

我的问题是,当我有多个赛车手时,我在不同的比赛中拥有相同的最快圈速,并且不应该那样。它应该让我在某场比赛中获得最快圈速。

以下是sqlfiddle链接。

1 个答案:

答案 0 :(得分:1)

MIN和&#34;双组由&#34;不是问题所在。

看起来你错过了一个连接条件。看起来laps的加入应该包含与特定races的匹配。我只看到给定racers的连接条件。

如果race_id中有laps列,那么就像这样:

  ...
  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中的特定行匹配,那么架构就会出现问题。

另一种可能性(当然)是架构是正确的。并且查询将返回竞赛的最快圈数,因此对于每个racers,查询将返回给定races的相同最快时间。

另请注意,WHERE子句中的条件否定了LEFT JOIN的外部性。如果你真的希望那是一个&#34;外部&#34;加入,然后将该条件移动到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
  ...