我有两个查询想要合并,但我遇到了一个问题,我相信这与我执行 LEFT JOIN 时的 GROUP BY Date 有关。日期格式相同,我需要在查询 2 的查询 1 中包含的唯一列是 Qty WHERE Date = Date。
任何帮助将不胜感激!
谢谢 天使
查询1
$dbGreeterReport = mysqli_query($conn, "SELECT COUNT(*) AS Cars, Date, SUM(Families), SUM(People), Families, People, Testimony, SUM(IF(Prayer = 'Yes', 1, 0)) AS Prayer, COUNT(DISTINCT Zipcode) AS Zipcodes
FROM Greeter_Detail
WHERE $dateRange
GROUP BY Date");
查询2
$dbSalv = mysqli_query($conn, "SELECT *, Date
FROM Salv
WHERE $dateRange
GROUP BY Date");
我尝试加入如下:
LEFT JOIN Greeter_Detail ON Greeter_Detail.DATE = Salv.Date
我正在寻找如下结果,按日期按行分组:
Date Cars Families People Prayer Qty
01/06/2024 177 323 1,199 162 5
MySQL 日期/时间数据类型 包括比“日期”更精确的类型,例如2024-01-08 不等于 2024-01-08 17:23:47 - 但您可能只会在屏幕上看到“2024-01-08”。因此,当尝试按“日期”连接数据时,请确保连接的双方都只是日期,并且不比日期更精确。这可以使用函数
DATE(datecolumn)
或 DATE_FORMAT(datecolumn,'%y-%m-%d')
来完成。
MySQL 中的 GROUP BY 查询
关于查询的另一个非常重要的一点是,它们依赖于 MySQL 的一个“非常不精确”的功能,而您不应该依赖这个功能。 想象一下这个
insert into test (code1, code2, value) values
('a','x',100)
, ('a','y',200)
, ('a','z',300)
这个查询:
选择 * , 总和(值) 从测试 通过...分组 代码1
您可能期望结果只有一行,如下所示:
代码2 | 总和(值) | |
---|---|---|
x | 600 |
毕竟“x”的源行只有值 100 那么为什么 MySQL 显示“x”? 答案:因为它是任意的(因此可能具有误导性!),更多信息请参见
this fiddle要永久避免这些任意/误导性结果,您在形成分组查询时需要付出更多努力 - 为了帮助强制执行此操作,您应该在(所有)MySQL 环境中设置 ONLY_FULL_GROUP_BY ON。
看建议查询启用 ONLY_FULL_GROUP_BY 后,您将必须更具体地了解查询中包含的非聚合列,例如:
SELECT
DATE(date) AS date
, COUNT(*) AS Cars
, SUM(Families)
, SUM(People)
, SUM(CASE WHEN Prayer = 'Yes' THEN 1 ELSE 0 END) AS Prayer
, COUNT(DISTINCT Zipcode) AS Zipcodes
FROM Greeter_Detail
WHERE $DATERANGE
GROUP BY DATE(date)
SELECT
DATE(date) AS date
, SUM(Qty) AS Qty
FROM Salv
WHERE $DATERANGE
GROUP BY DATE(date)
注意,现在不再有 MySQL 需要选择任意值来显示的列(例如
select *
已替换为
SELECT DATE(date) AS date
)。另请注意,现在当您将 2 个结果连接在一起时,“日期”列更有可能找到完全匹配的结果。