使用按日期分组连接 2 个表

问题描述 投票:0回答:1

我有两个查询想要合并,但我遇到了一个问题,我相信这与我执行 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
sql mysql join
1个回答
0
投票

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

您可能期望结果只有一行,如下所示:

代码1a
代码2 总和(值)
x 600
但是为什么 code2 是“x”?

毕竟“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 个结果连接在一起时,“日期”列更有可能找到完全匹配的结果。

© www.soinside.com 2019 - 2024. All rights reserved.