2012-09-01 57 views
2

對不起,關於複雜的標題。左連接,返回不匹配的行,右表中的where子句,由

我有兩個表,客戶和訂單:

客戶 - 名稱可能被複制,ID是唯一的:

name | cid 
a | 1 
a | 2 
b | 3 
b | 4 
c | 5 

訂單 - PID是獨一無二的,參加在CID:

pid | cid | date 
1 | 1 | 01/01/2012 
2 | 1 | 01/01/2012 
3 | 2 | 01/01/2012 
4 | 3 | 01/01/2012 
5 | 3 | 01/01/2012 
6 | 3 | 01/01/2012 

所以我用這個代碼得到一個計數:

select customers.name, orders.date, count(*) as count 
from customers 
left JOIN orders ON customers.cid = orders.cid 
where date between '01/01/2012' and '02/02/2012' 
group by name,date 

工作正常,但沒有給我空行,當客戶的cid在訂單中沒有匹配cid時,例如, name-c,id-5

select customers.name, orders.date, count(*) as count 
from customers 
left JOIN orders ON customers.cid = orders.cid 
AND date between '01/01/2012' and '02/02/2012' 
group by name,date 

因此,我改變了應用於連接的位置,它工作正常,它給了我空行。 因此,在這個例子中,我會得到:

name | date  | count 
a | 01/01/2012 | 3 
b | null  | 1 
b | 01/01/2012 | 3 
c | null  | 1 

但因爲名字有不同的CID的它給我即使名稱本身確實有訂單行,我不想空行。

所以我正在尋找空行的方式,只有當任何其他共享相同名稱的cid的訂單中沒有任何行時才返回。

感謝您的任何幫助。

---編輯---

我已編輯計數空行,計數永遠不會返回空但1

select * from (select customers.name, orders.date, count(*) as count 
from customers 
left JOIN orders ON customers.cid = orders.cid 
AND date between '01/01/2012' and '02/02/2012' 
group by name,date) as t1 group by name 

結果是

name | date  | count 
a | 01/01/2012 | 3 
b | null  | 1 
c | null  | 1 
+0

我能想到的最簡單的辦法是把你的查詢到一個子查詢組按名稱查詢 – knittl

+0

@ knittl我試過 select * from(select customers.name,orders.date,count(*)as count from customers left JOIN orders on customers.cid = orders.cid AND date between' 01/01/2012'和'02/02/2012' 組名稱,日期)作爲t1組的名稱 但它只是將所有內容合併到它的第一個約會中,你的意思是別的嗎? – mrmryb

+0

這就是我的意思,但你是對的,它沒有按預期工作。 – knittl

回答

3

首先,選擇您的日期由(name, date)分組,排除NULL S,然後用一組不同的名稱加入:

SELECT names.name, grouped.date, grouped.count 
FROM (SELECT DISTINCT name FROM customers) as names 
LEFT JOIN (
    SELECT customers.name, orders.date, COUNT(*) as count 
    FROM customers 
    LEFT JOIN orders ON customers.cid = orders.cid 
    WHERE date BETWEEN '01/01/2012' AND '02/02/2012' 
    GROUP BY name,date 
) grouped 
ON names.name = grouped.name 
+2

嘿,查詢很好,只是重命名分組到子和'SELECT sub.name'到'SELECT names.name',這裏是sql小提琴:http://sqlfiddle.com/#!2/3d4f5/1/0 – Ankur

+0

作品完美,謝謝,但我確實需要在命令末尾添加'按名稱,日期排序',有點困惑,爲什麼sqlfiddle上的版本不需要該版本 – mrmryb

+0

默認情況下,集合是無序的,沒有定義返回結果的順序。 – knittl

0

最好的方法是根據Cid和其他參數將它們組合在一起。 所以你會得到正確的輸出與基於左外部連接的NULL值。