[编辑]看来我的查询大部分都是正常的 - 但是有些东西缺失导致某些边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`
答案 0 :(得分:0)
我从朋友那里得到了一些帮助:
将'pre'和'post'表连接在一起产生一个笛卡尔积 - 所以'pre'表中的三个'0101'行将与'post'表中的所有4'0101'行连接,从而导致总和12,而不是你想要的3。要从两个不同的表中获取单个计数,您需要使用子选择查询,例如:
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