MySQL - 从两个表中获取两个计数并将它们按另一列分组

标签 mysql sql join

[编辑] 看来我的查询基本上没有问题 - 但缺少某些内容导致某些边 ID 在循环中或其他内容中被计数。我怀疑问题出在双 LEFT JOIN 上,但我无法弄清楚。

我有三个表(PrePostSchedule),我想从表 中获取行数Pre 和表 Post 并且如果该端 ID 的安装日期与我的查询匹配,则根据站点 ID(这在所有三个表中都很常见)将结果组计为不同的列.这是我正在处理的内容:

Table 'Pre'
site  | timestamp
-------------------------
0101  | 2016-01-01 13:00
0101  | 2016-01-01 12:00
3345  | 2016-01-01 12:30
6500  | 2016-01-01 16:00
6500  | 2016-01-01 11:00
0101  | 2016-01-01 18:00

Table 'Post'
site  | timestamp
-------------------------
0101  | 2016-01-02 03:00
0101  | 2016-01-02 02:00
6500  | 2016-01-02 01:00
0101  | 2016-01-02 08:00
0101  | 2016-01-02 05:30
8888  | 2016-12-31 12:30

Table 'Schedule'
site  | install_date
------------------------
0101  | 2016-01-01
3345  | 2016-01-01
6500  | 2016-01-01
8888  | 2015-12-29

Desired Query Result:
site  | install_date |  pre  |  post
-------------------------------------
0101  | 2016-01-01   |   3   |    4
3345  | 2016-01-01   |   1   |    0
6986  | 2016-01-01   |   2   |    1

这是我尝试过的查询,但我得到的结果不准确。

SELECT t1.`site`, t1.`install_date`, SUM(CASE WHEN t2.`timestamp` >= NOW() - INTERVAL 1 DAY THEN 1 ELSE 0 END) as 'pre',
SUM(CASE WHEN t3.`timestamp` >= NOW() - INTERVAL 1 DAY THEN 1 ELSE 0 END) as 'post'
FROM `Schedule` t1
LEFT JOIN `Pre` t2 ON t1.`site` = t2.`site`
LEFT JOIN `Post` t3 ON t1.`site` = t3.`site`
WHERE t1.`install_date` = CURDATE() - INTERVAL 1 DAY
GROUP BY t1.`site`

最佳答案

我得到了 friend 的一些帮助:

Joining the ‘pre’ and ‘post’ tables together results in a cartesian product - so the three ‘0101’ rows in the ‘pre’ table will join with all 4 ‘0101’ rows in the ‘post’ table resulting in a sum of 12, not 3 as you want. To get individual counts from two different tables, you need to use sub-select queries, like:

SELECT site, install_date, (SELECTION COUNT(*) FROM pre WHERE Pre.site = Schedule.site AND Pre.timestamp <= NOW() - INTERVAL 1 DAY) AS 'pre', (SELECT COUNT(*) FROM post WHERE Post.site = Schedule.site AND Post.timestamp >= NOW() - INTERVAL 1 DAY) AS 'post' FROM Schedule

关于MySQL - 从两个表中获取两个计数并将它们按另一列分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40425807/

相关文章:

php - 从多个表中选择并显示到表中

php - 我们可以在 Laravel 中创建一个 "Class Level Relationship"而不是 "Object Level Relationship"吗?

php - MySQL:基于列值自动递增?

MYSQL Concat、Left Join、Group解决方案

sql - "BEGIN"关键字使用不当

python - MySQL 列名中的通配符

mysql - 没有来自第二个表的结果的内连接

mysql - 根据两个连接表结果从查询中排除记录

mysql - 我正在尝试减去 2 个字段并将结果插入数据库

php - 如果内部数组中有匹配项,则获取外部数组的索引