我正在运行一个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`
答案 0 :(得分: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月的比赛和比赛。
但是,你可能正在寻找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`
答案 1 :(得分:1)
我最好的猜测是,jocky姓氏不是唯一的。尝试按表达式将组更改为:
group by `jockeys`.`JockeyInitials`, `jockeys`.`JockeySurName`
通常,在聚合查询的SELECT
子句中包含未包含在GROUP BY
行中的列是不好的做法。您可以在MySQL(但不在其他数据库中)执行此操作,因为(错误)功能称为隐藏列。