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

时间:2016-11-04 15:00:50

标签: 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`

1 个答案:

答案 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