2016-11-04 75 views
1

[編輯]看起來我的查詢大部分都是正常的 - 但有些東西缺失導致某些側ID被計入循環中或其他東西。我懷疑這個問題是出現在左側的連接處,但我很難搞清楚。MySQL - 從兩個表中獲取兩個計數,並將它們分組到另一個列

我有三個表(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

招'where'條件到'join'條款。 –

+0

我認爲't1.install_date'也應該進入group by子句 –

+0

@vkp - 移動where子句時出現錯誤。我嘗試將它添加到一個和兩個'LEFT JOIN'。 –

回答

0

我有一個朋友一些幫助:

加入「前」和「後」表一起導致笛卡爾積 - 這樣的三個「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

相關問題