2013-06-27 33 views
0

我有這樣一個模式:如何在一個SQL查詢中獲得多個列的計數?

PetOwner: 
owner_id | first_name | last_name 
--------------------------------- 
1  | john  | smith 
2  | jane  | doe 
3  | jack  | jones  

Pets: 
pet_id | owner_id | name | type 
------------------------------- 
1  | 1  | a | dog 
2  | 1  | b | dog 
3  | 1  | c | dog 
4  | 1  | d | cat 
5  | 1  | e | cat 
6  | 1  | f | fish 
7  | 2  | g | dog 
8  | 2  | h | dog 
9  | 2  | i | fish 
10  | 3  | j | dog 

而且我想編寫一個查詢,讓我:

first_name | last_name | dog_count | cat_count | fish_count 
----------------------------------------------------------- 
john  | smith  | 3   | 2   | 1 
jane  | doe  | 2   | 0   | 1 
jack  | jones  | 1   | 0   | 0 

有一組已知的寵物類型,所以這並不需要爲任意類型創建一個列。另外,任何沒有特定類型寵物的所有者應該爲該寵物類型計數0。

我已經嘗試過類似的查詢:

SELECT first_name, last_name, owner_id, type, COUNT(*) 
FROM Pets, PetsOwner 
GROUP_BY owner_id, type 

這將產生:

first_name | last_name | owner_id | type | COUNT(*) 
--------------------------------------------------- 
john  | smith  | 1  | dog | 3 
john  | smith  | 1  | cat | 2 
john  | smith  | 1  | fish | 1 
jane  | doe  | 2  | dog | 2 
jane  | doe  | 2  | fish | 1 
jack  | jones  | 3  | dog | 1 

但是這需要遍歷結果集來得到我要找的輸出,很明顯的東西避免與SQL。此外,它不提供表中缺少的寵物類型的默認值0。

是否可以用一個SQL查詢做到這一點?如果沒有,是否有我能做的查詢比我找到的查詢更好(即更容易處理)?

這是一個MySQL數據庫,如果這有所作爲。

感謝您的幫助。

回答

2

使用SUM,而不是COUNT:

SELECT o.first_name, o.last_name, 
     SUM(CASE WHEN p.type = 'cat' THEN 1 ELSE 0 END) as cat_count, 
     SUM(CASE WHEN p.type = 'dog' THEN 1 ELSE 0 END) as dog_count, 
     SUM(CASE WHEN p.type = 'fish' THEN 1 ELSE 0 END) as fish_count 
FROM PetOwners o 
JOIN Pets p ON o.id = p.owner_id 
GROUP BY o.id 

如果你想以包括不具有任何寵物可言,改變JOINLEFT JOIN業主。

相關問題