[编辑] 看来我的查询基本上没有问题 - 但缺少某些内容导致某些边 ID 在循环中或其他内容中被计数。我怀疑问题出在双 LEFT JOIN 上,但我无法弄清楚。
我有三个表(Pre
、Post
、Schedule
),我想从表 中获取行数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/