具有日期范围,多个表的Mysql摘要查询

时间:2012-09-27 16:42:35

标签: mysql sql

我正在运行一个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`

2 个答案:

答案 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(但不在其他数据库中)执行此操作,因为(错误)功能称为隐藏列。