2017-11-10 96 views
-1

我在MySql數據庫中有這3個表。在MySql查詢中加入3個表

users 
+----+------+--------+------+ 
| Id | Name | Status | Role | 
+----+------+--------+------+ 
| 1 | A | Aktiv | Op | 
| 2 | B | Aktiv | Op | 
| 3 | C | Aktiv | Op | 
| 4 | D | Aktiv | Op | 
+----+------+--------+------+ 

cnt 
+----+------+------------+------+ 
| Id | Name | Date  | Type | 
+----+------+------------+------+ 
| 1 | A | 2017-11-09 | Web | 
| 2 | B | 2017-11-09 | Web | 
| 3 | C | 2017-11-09 | Web | 
| 4 | C | 2017-11-09 | Inb | 
| 5 | A | 2017-11-09 | Web | 
+----+------+------------+------+ 

Lead 
+----+------+------------------+------------+ 
| Id | Name | Date    | Type  | 
+----+------+------------------+------------+ 
| 1 | A | 2017-11-09 00:24 | Imported | 
| 2 | B | 2017-11-09 09:32 | Activation | 
| 3 | B | 2017-11-09 10:56 | Activation | 
| 4 | D | 2017-11-09 12:21 | Activation | 
| 5 | D | 2017-11-10 12:22 | Activation | 
+----+------+------------------+------------+ 

我想加入他們的主表,但沒有成功,我使用的查詢是:

SELECT IFNULL(u.Name,'Total') as "Name", 
Sum(IF(c.Type = 'Web',1,0)) as "Cnt Web", 
Sum(IF(l.Type = 'Activation',1,0)) as "Lead Web" 
FROM users u 
LEFT JOIN cnt c ON u.Name = c.Name and c.Date = '2017-11-09' 
LEFT JOIN lead l ON u.Name = l.Name and l.Date>= '2017-11-09' AND l.Date< '2017-11-10' 
WHERE u.Status = 'Aktiv' AND u.Role = 'Op' 
GROUP BY u.Name WITH ROLLUP 

結果我需要的是這樣的一個表:

+----+------+--------+---------+ 
| Id | Name | Cnt Web| Lead Web| 
+----+------+------------------+ 
| 1 | A | 2  | 0  | 
| 2 | B | 1  | 2  | 
| 3 | C | 1  | 0  | 
| 4 | D | 0  | 1  | 
+----+------+------------------+ 

當我嘗試加入與第二個第一個表或第一個與第三個,我得到正確的結果,但我不能得到所需的結果,當我加入他們所有。

任何答案是最受歡迎的。先謝謝你。

+0

的可能的複製(https://stackoverflow.com/questions/45250646 [從兩個LEFT的GROUP \ _CONCAT奇怪行爲重複GROUP \ _BYs的JOIN的]/odd-duplicate-behavior-from-group-concat-of-two-left-join-of-group-bys) – philipxy

+0

爲什麼Lead web對於ID 4的值爲1,不應該是2,因爲有D的主表中有2條記錄? – SEarle1986

+0

@ SEarle1986因爲一個在2017-11-09,另一個在2017-11-10,我只需要那些在2017-11-09,正如我在上面的slq代碼中所解釋的那樣。 – Eriontp

回答

0

下面是一個使用相關子查詢

溶液
SELECT u.Id, 
     u.Name, 
     (SELECT COUNT(Name) FROM cnt WHERE Name = u.name AND type = 'Web' AND Date = '2017-11-09') AS cnt_web, 
     (SELECT COUNT(Name) FROM lead WHERE Name = u.name AND type = 'Activation' AND Date>= '2017-11-09' AND Date< '2017-11-10') AS cnt_lead 
FROM users u 
WHERE u.Status = 'Aktiv' AND u.Role = 'Op' 
+0

它工作在1.0613秒,我失去了ROLLUP。無論如何非常感謝 – Eriontp