【问题标题】:mySQL group by function showing lack of datamySQL 按函数分组显示缺少数据
【发布时间】:2018-12-03 20:21:23
【问题描述】:

我所追求的是查看特定比赛的最快圈速,这将通过使用比赛名称和比赛日期来确定。

SELECT lapName AS Name, lapDate AS Date, T
FROM Lap 
    INNER JOIN Race ON Lap.lapName = Race.Name
        AND Lap.lapDate = Race.Date
GROUP BY Date;

它目前只显示 3 个不同的比赛名称,4 个不同的日期,这意味着我总共有 4 个组合,而实际上有 9 个唯一的比赛名称、比赛日期组合。

唯一的比赛数据存储在 Race 表中。单圈时间存储在 LapInfo 表中。

我还收到了关于我的组声明的警告,说它虽然仍在运行,但它是模棱两可的。

【问题讨论】:

  • 你需要使用某种聚合——我假设min(laptime)...
  • 不幸的是,当涉及到分组时,MySQL 允许错误的 SQL。根据经验,任何不在GROUP BY 中的列都需要聚合,使用MIN()MAX()SUM() 等。请这样做以确保我们得到您的查询。
  • 并请注明每列所属的表格。例如,代替raceDate 输入Race.raceDate

标签: mysql sql group-by inner-join


【解决方案1】:

您似乎不需要join

SELECT l.lapRaceName, l.lapRaceDate, 
       MIN(l.lapTime)
FROM LapInfo l
GROUP BY l.lapRaceName, l.lapRaceDate;

如果您不需要JOIN,则在查询中添加一个是多余的。

【讨论】:

  • 我认为我需要一个内部连接来确保不考虑空值?
  • @bemzoo 。 . .只需添加where lapracename is not null and lapracedate is not null。据推测,比赛名称是有效名称,因此内部连接是多余的。
【解决方案2】:

首先,您的查询实际上是无效的 SQL。您需要使用MIN 函数来获得最快的lapTime。此外,您必须GROUP BY lapRaceName, raceDate 而不仅仅是lapRaceName。不幸的是,在这种情况下,mysql 足够松懈,可以毫无错误地执行它。

此外,您将LapInfoRace 连接起来,并返回来自LapInfo 的连接列,您将其别名为可以在Race 中找到的名称。从 SQL 的角度来看这没问题,但这也太复杂了:直接返回 Race 表中的列,因为它们具有您要查找的名称。

最后,最好指明每列属于哪个表。这里,列lapTime 属于表LapInfo,所以让我们明确一下。

查询:

SELECT 
    Race.raceName,
    Race.raceDate, 
    MIN(LapInfo.lapTime)
FROM 
    Race 
    INNER JOIN LapInfo
        ON  LapInfo.lapRaceName = Race.raceName
        AND LapInfo.lapRaceDate = Race.raceDate
GROUP BY 
    Race.raceName,
    Race.raceDate
;

【讨论】:

  • 谢谢,也许 mySQL 不适合学习语法。此外,您会发现最慢的单圈时间而不是最快的。
猜你喜欢
  • 1970-01-01
  • 2017-11-23
  • 1970-01-01
  • 1970-01-01
  • 2021-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多