2011-08-01 30 views
1

我有表prod with structure Id,name,keyword,yearborn。兩個My SQL查詢問題

,有必要使分組在現場遇到yearborn關鍵字的數量,例如

SELECT yearborn, COUNT(Id) cnt1 FROM prod WHERE keyword='admiral' 
GROUP BY yearborn 

SELECT yearborn, COUNT(Id) cnt2 FROM prod WHERE keyword='captain' GROUP BY yearborn 

如何合併這兩個查詢,以獲得輸出結果表

yearborn,cnt1,cnt2

我已經試過UNION

SELECT yearborn, COUNT(Id) cnt1 FROM prod WHERE keyword='admiral' GROUP BY yearborn 
UNION 
SELECT yearborn, COUNT(Id) cnt2 FROM prod WHERE keyword='captain' GROUP BY yearborn 

但是結果是: yearborn,CNT1

請告訴我如何擺脫這種局面。

回答

1
SELECT yearborn, 
     SUM(IF(keyword = 'admiral', 1, 0)) cnt1, 
     SUM(IF(keyword = 'captain', 1, 0)) cnt2 
    FROM prod 
    WHERE keyword = 'admiral' 
     OR keyword = 'captain' 
GROUP BY yearborn 

結果會是這樣的(當然這是虛擬數據):

+----------+------+------+ 
| yearborn | cnt1 | cnt2 | 
+----------+------+------+ 
|  2004 | 1233 | 0 | 
|  1999 | 0 | 15 | 
+----------+------+------+ 
0
SELECT yearborn, COUNT(Id) cnt1, NULL cnt2 FROM prod WHERE keyword='admiral' GROUP BY yearborn 
UNION 
SELECT yearborn, NULL cnt1, COUNT(Id) cnt2 FROM prod WHERE keyword='captain' GROUP BY yearborn 
0

如何:

SELECT yearborn,SUM(cnt1),SUM(cnt2) FROM 
( 
    SELECT yearborn, COUNT(id) cnt1, 0 cnt2 FROM prod WHERE keyword='admiral' 
    UNION ALL 
    SELECT yearborn, 0 cnt1, COUNT(id) cnt2 FROM prod WHERE keyword='captain' 
) 
GROUP BY yearborn 
1

您可以在關鍵字條件採用了SUM()來做到這一點,因爲在MySQL比較的結果可以爲0(假)或1(被處理true):

SELECT yearborn, SUM(keyword='admiral') cnt1, SUM(keyword='captain') cnt2 FROM prod GROUP BY yearborn 

這也有隻使用一個表掃描(它比使用聯合和子查詢更快)的優點。

+0

謝謝你,它的工作原理 – vitalii

0

好了,你可以試試這個:

SELECT `yearborn`, 
COUNT(`Id`) AS `cnt1` 
FROM `prod` 
WHERE `keyword` IN ('admiral','captain') 
GROUP BY `yearborn`,`keyword`; 

編輯: 在GROUP加入keyword BY statment。