2017-11-10 18 views
-1

私はこの3つのテーブルをMySqlデータベースに持っています。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  | 
+----+------+------------------+ 

最初のテーブルを2番目のテーブルに結合しようとすると、最初のテーブルに3番目のテーブルを結合しようとすると、正しい結果が得られますが、それらをすべて結合すると必要な結果が得られません。

すべての回答が最も歓迎されます。前もって感謝します。

+0

サブ照会可能な複製を使用して溶液[2つの左の群\ _CONCATから奇妙な重複現象がGROUP \ _BYsのJOINを(https://stackoverflow.com/questions/45250646です/奇妙な - 重複 - ビヘイビア - グループ - 連結の2つの左結合グループの) – philipxy

+0

IDの4のために1つの値があるのはなぜですか? Dのリードテーブルに2つのレコード? – SEarle1986

+0

@ SEarle1986 1つは2017-11-09にあり、もう1つは2017-11-10にあり、上記のslqコードで説明した通り、2017-11-09のものだけが必要です。 – 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

関連する問題