0

我正在运行一个 sql 查询,该查询在我选择的日期(2012-07-01 - 2012-08-01)之间返回结果。我可以从价值观中看出它们是错误的。

我很困惑,因为它没有告诉我我有语法错误,但返回的值是错误的。

我数据库中的日期以 YYYY-mm-dd 格式存储在日期列中。

SELECT `jockeys`.`JockeyInitials` AS `Initials`, `jockeys`.`JockeySurName` AS Lastname`,
       COUNT(`runs`.`JockeysID`) AS 'Rides', 
       COUNT(CASE
                  WHEN `runs`.`Finish` = 1 THEN 1 
                  ELSE NULL 
             END
             ) AS  `Wins`, 
        SUM(`runs`.`StakeWon`) AS 'Winnings'
  FROM runs
 INNER JOIN jockeys ON runs.JockeysID = jockeys.JockeysID
 INNER JOIN races ON runs.RacesID = races.RacesID
 WHERE `races`.`RaceDate` >= STR_TO_DATE('2012,07,01', '%Y,%m,%d')
   AND `races`.`RaceDate` <= STR_TO_DATE('2012,08,01', '%Y,%m,%d')
 GROUP BY `jockeys`.`JockeySurName` 
 ORDER BY `Wins` DESC`
4

2 回答 2

1

我最好的猜测是,这些爱开玩笑的姓氏并不是唯一的。尝试将 group by 表达式更改为:

group by `jockeys`.`JockeyInitials`, `jockeys`.`JockeySurName`

SELECT通常,在聚合查询的子句中包含行中未包含的列是不好的做法GROUP BY。您可以在 MySQL 中执行此操作(但不能在其他数据库中),因为称为隐藏列的(错误)功能。

于 2012-09-27T17:53:26.513 回答
1

很难从您的问题中猜出问题所在。

您是否想总结 7 月的所有比赛和 8 月 1 日的比赛?这是一个有点奇怪的日期范围。

如果您想更精确,您应该尝试以下类型的日期范围选择。如果您的 races.RaceDate 列是 DATETIME 表达式,则必须使用它。

 WHERE `races`.`RaceDate` >= STR_TO_DATE('2012,07,01', '%Y,%m,%d')
   AND `races`.`RaceDate` <  STR_TO_DATE('2012,08,01', '%Y,%m,%d') + INTERVAL 1 DAY

这将在 8 月 1 日的任何时间恢复 7 月的比赛和比赛。

但是,您可能只是在寻找七月的比赛。在这种情况下,您可以尝试:

 WHERE `races`.`RaceDate` >= STR_TO_DATE('2012,07,01', '%Y,%m,%d')
   AND `races`.`RaceDate` <  STR_TO_DATE('2012,07,01', '%Y,%m,%d') + INTERVAL 1 MONTH

从 7 月 1 日午夜(含)到 8 月 1 日午夜(不包括在内),这一切都将接踵而至。

另外,您没有GROUP BY正确使用。汇总时,结果集中的每一列都必须是汇总(SUM()COUNT()其他聚合函数)或在 GROUP BY 子句中提及。一些 DBMS 强制执行此操作。MySQL 只是顺其自然,并给出了奇怪的结果。试试这个表达。

GROUP BY `jockeys`.`JockeyInitials`,`jockeys`.`JockeySurName` 
于 2012-09-27T17:12:52.167 回答