首页 > 解决方案 > mySQL - 仅显示最常见的 & 所有其他列组合显示 0

问题描述

我正在尝试计算任何一辆车在一场比赛中发生的最高撞车次数,因此一辆汽车可能在一场比赛中发生多次撞车事故(形象地)。我有一个包含以下列的崩溃表:

c_raceName, c_raceDate,c_raceId和其他不相关的。

首先,为了唯一地识别一个种族,它是一raceName对的raceDate。要唯一识别崩溃,您必须将此对与raceId.

所以所有这些列实际上属于另一个表,即我们的Entry表。此表包含参加比赛的汽车的信息。此表具有以下列:

e_raceId, e_raceDate, e_raceName, e_raceEntryCarId, e_raceEntryDriverId.

我意识到并不是每场比赛都会进入表格,所以我相信我要么必须从表格Crash中引用表格,要么反过来。EntryCrash

此外,如果数据还没有包含在比赛条目中,并且raceNameraceDate数据对只存在于Race保存r_raceNamer_raceDate基础信息的表上,该怎么办。

所以我相信我可能需要做的是SELECTCrash牌桌开始,JOIN一直到Entry牌桌,再到牌桌,Race才能真正得到所有raceNameraceDate对子。虽然我不知道如何编写一个条件来说明如果这些对不存在于Crash表中,那么在我的输出中我希望它们被赋予 0 的值,或者让它们出现在我的输出中实际上。

所以我已经做到了这一点:

SELECT DISTINCT l.c_raceName AS raceName, 
l.c_raceDate AS raceDate, 
COUNT( l.c_raceId) AS mostCrashes 

FROM Crashes l
GROUP BY l.c_raceId
;

产生以下输出:

raceName | raceDate | mostCrashes
---------------------------------
Race 1   |2018/01/21| 1
Race 1   |2018/01/21| 3
...      | ...      | ...

所以我已经能够将它们分成 3 和 1,如上所示,尽管我只希望显示最多的崩溃,所以 3 行。此外,我希望所有没有发生任何崩溃的比赛都显示为 0,而不是根本不显示。所以我正在寻找的输出是:

raceName | raceDate | mostCrashes
---------------------------------
Race 1   |2018/01/21| 3
Race 2   |2018/01/21| 5
Race 1   |2018/09/11| 0
Race 1   |2016/03/14| 0

等等

标签: mysqlsqlcountdistinct

解决方案


您的问题有多个部分。如果你想要0值,那么你需要一个外连接或相关子查询。我想你有一张包含所有比赛的桌子,但桌子select distinct上的aentries也可以。

然后,如果您想要每辆车的碰撞次数最多,则需要表中的汽车标识符crashes。我确定有一个(这很有意义),但是您没有在问题中描述它。我猜是这样的c_raceEntryCarId

结果查询如下所示:

select e_racename, e.e_racedate,
       (select count(*)
        from crashes c
        where c.c_racename = e.e_racename and c.e_racedate = e.e_race_date 
        group by c.c_raceEntryCarId
        order by count(*) desc
        limit 1
       ) as most_crashes
from (select e.e_racename, e.e_racedate
      from entries e
      group by e.e_racename, e.e_racedate
     ) e;

如果您只想要每场比赛的崩溃次数,子查询会有点不同:

select e_racename, e.e_racedate,
       (select count(*)
        from crashes c
        where c.c_racename = e.e_racename and c.e_racedate = e.e_race_date
       ) as most_crashes
from (select e.e_racename, e.e_racedate
      from entries e
      group by e.e_racename, e.e_racedate
     ) e;

推荐阅读