我正在运行一个 SQL 查询,该查询返回我选择的日期(2012-07-01 - 2012-08-01)之间的结果。但我可以从值(value)观看出他们是错误的。
我很困惑,因为它没有告诉我有语法错误,但返回的值是错误的。
我的数据库中的日期以 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`
最佳答案
很难从你的问题中猜出问题所在。
您想总结 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
这将收集 7 月的比赛和 8 月 1 日任意时间的比赛。
但是,您可能只寻找七月的比赛。在这种情况下,您可以尝试:
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`
关于Mysql带日期范围、多表汇总查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12626191/