Mysql带日期范围、多表汇总查询

标签 mysql sql

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

相关文章:

php - 在mysql中插入多行且列的固定值的最快方法

php - 接下来 7 天的生日计数以及每天需要的生日计数和总数

mysql - SQL 过程 : NOT EXISTS seems to be always true

sql - 去年的 YTD 编号查询

php - 如何编写具有多个数据顺序的 MySql 查询?

php - 如何使用数组进行 MYSQL 查询

mysql - 数据库内连接查询

sql - 您如何根据连接哪个表以创建行来将文字放入结果 sql 结果集中?

mysql - 为什么 "marks < max(marks)"不起作用

mysql - 如何检查其他人是否编辑同一实体