2012-05-11 5 views
6

Dada la tabla foo:cómo determinar si un valor aparece en un grupo a grupo

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

Si hago SELECT * GROUP BY Num que, por supuesto, obtener algo como esto:

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

lo que había gustaría a refinar esta es:

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

probablemente hay un simple SELECT IF() PLU sa ORDER BY, pero no puedo verla ahora ...

En mi ejemplo del mundo real, la tabla resultante es LEFT JOIN ed a otra mesa y yo quiero ser capaz de rechazar las entradas No pero mantener el NULL s si mi otra tabla bar tiene una fila Num = 4.

Respuesta

14

Uso SUM(condition) dentro del IF:

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

Su JOIN entonces es:

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

Gracias ¡tú! El primero funciona Cambié la expresión a 'IF (SUM (Letter = 'C') = COUNT (Letter), 'Yes', 'No')' ya que mi ejemplo de la vida real necesita verificar todas las C, y puedo aplicar eso a hacer funcionar mi consulta completa (También es probable que sea hora de refactorizar y normalizar mis tablas ...) –

+0

@ KenY-N: Para verificar si son * todas * 'C', sería más sencillo buscar cualquier valor que * no * C: 'SUM (Letra <> 'C')'. – eggyal

+0

¡Ahh, por supuesto! –

1

Si tiene LEFT JOIN la tabla consigo mismo, puede determinar fácilmente si hay valores correspondientes o no.

Esto hace el trabajo si se toma el valor "C" en cuenta:

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; 
Cuestiones relacionadas