2012-05-11 32 views
6

如何確定一個值出現在GROUP BY鑑於表<code>foo</code>

Num Letter 
------------ 
1  A 
1  B 
1  B 
2  C 
3  A 
3  C 
3  D 

如果我做SELECT * GROUP BY Num我當然得到的東西是這樣的:

Num Letter 
------------ 
1  A 
2  C 
3  A 

我會喜歡將其細化爲:

Num Has_No_Letter_C 
--------------------- 
1  Yes 
2  No 
3  No 

可能有一個簡單的SELECT IF() plu SA ORDER BY,但我不能看到它現在...

在我的現實世界的例子,所得到的表是LEFT JOIN版到另一個表,我希望能夠拒絕No項,但保持NULL如果我的其他表barNum = 4行。

回答

14

使用SUM(condition)IF內:

SELECT Num, 
     IF(SUM(Letter = 'C'), 'Yes', 'No') AS Has_Letter_C 
FROM  my_table 
GROUP BY Num 

JOIN就變成了:

SELECT another_table.Num 
FROM  another_table LEFT JOIN my_table ON another_table.Num = my_table.Num 
GROUP BY another_table.Num 
HAVING my_table.Num IS NULL OR SUM(my_table.Letter = 'C') > 0 
+1

謝謝您!第一個作品。我將表達式改爲IF(SUM(Letter ='C')= COUNT(Letter),'Yes','No'),因爲我的現實生活中的例子需要檢查所有的Cs,我可以將其應用於讓我的完整查詢工作。 (這也可能是我對錶格進行了重構和規範化的時候......) –

+0

@ KenY-N:要檢查它們是否全部是''C',查找任何不是* C的值都會更簡單: SUM(Letter <>'C')'。 – eggyal

+0

啊,當然! –

1

如果你自己的表爲LEFT JOIN,你可以很容易地確定是否有相應的值。

這做工作,如果你把值 「C」 到:

SELECT t1.num, 
      IF(ISNULL(t2.num),"Yes","No") AS "Has_No_Letter_C" 
FROM  yourtable AS t1 
LEFT JOIN yourtable AS t2 ON t1.num=t2.num AND t2.`letter` = "C" 
GROUP BY num;