2012-05-11 11 views
6

Given tabela foo:Jak ustalić, czy wartość pojawia się w GROUP BY grupy

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

Jeśli robię SELECT * GROUP BY Num I oczywiście coś takiego:

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

co ja jak udoskonalić to jest:

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

jest prawdopodobnie proste SELECT IF() plu sa ORDER BY, ale nie widzę go teraz ...

W moim przykładzie świata rzeczywistego, powstałą tabela jest LEFT JOIN ed do innej tabeli i chcę, aby móc odrzucić No wpisy ale zachować NULL s jeśli moja druga tabela bar ma Num = 4 wiersz.

Odpowiedz

14

użytkowania SUM(condition) w IF:

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

Twój JOIN wówczas postać:

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

podziękowaniem ty! Pierwszy działa. Zmieniłem wyrażenie na "JEŻELI (SUMA (litera =" C ") = LICZBA (litera)," Tak "," Nie ")" ponieważ mój przykład z prawdziwego życia musi sprawdzić wszystkie C i mogę to zastosować do uzyskać pełne zapytanie. (Jest to prawdopodobnie również czas, w którym refaktoryzowałem i normalizowałem swoje tabele ...) –

+0

@ KenY-N: Aby sprawdzić, czy są one * wszystkie * 'C', łatwiej byłoby wyszukać dowolną wartość, która jest * nie * C: 'SUMA (litera <> 'C')'. – eggyal

+0

Ahh, oczywiście! –

1

Jeśli sam stwierdzisz, że tabela jest sama w sobie, możesz łatwo określić, czy istnieją odpowiednie wartości, czy nie.

ta spełnia swoje zadanie, jeśli wziąć wartość "C" pod uwagę:

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;