Pregunta

Tengo estructura de tabla como la siguiente:

ID   cond
1    5
1    2
1    6
8    2
9    1
9    5

Cuando quiero para seleccionar las filas que contienen una o más condiciones i uso o (... CUANDO cond = 2 O cond = 6 GROUP BY ID ...)

Pero cómo seleccionar las filas que contienen más de una condición a la vez agrupados por ID? P.ej. cuando quiero encontrar filas que contienen cond 2 y 6, se devuelve sólo 1 ID

Gracias

¿Fue útil?

Solución

Hay varias maneras de hacer esto.

El uso de COUNT (más rápido):

  

SELECT id FROM tbl WHERE tbl.cond IN ( 2, 6 ) HAVING COUNT(DISTINCT cond) = 2 GROUP BY id

El uso de EXISTS (utilizando bucles anidados, más lento en tablas muy grandes, pero menos críptico y más xtensible que la variante COUNT):

  

SELECT DISTINCT id FROM tbl AS tbl1 WHERE EXISTS (SELECT * FROM tbl AS tbl2 WHERE tbl1.id = tbl2.id AND tbl2.cond = 2) AND EXISTS (SELECT * FROM tbl AS tbl2 WHERE tbl1.id = tbl2.id AND tbl2.cond = 6)

El uso de GROUP_CONCAT (una variación específica de MySQL en el tema de la cuenta, pero si alguna vez quiere coincidencias exactas, por ejemplo cond = 2 y cond = 6 la otra cond, entonces el siguiente, alterada para leer SELECT id, GROUP_CONCAT(DISTINCT cond ORDER BY cond) AS conds ... WHERE conds='2,6' llevará a cabo mejor)

  

SELECT id, ','||GROUP_CONCAT(DISTINCT cond)||',' AS conds FROM tbl WHERE INSTR(conds, ',2,') > 0 AND INSTR(conds, ',6,') > 0 GROUP BY id

Otros consejos

Puede utilizar una combinación de lo siguiente:

SELECT  ID
FROM    tbl t1
        INNER JOIN
                tbl t2
                ON t1.ID = t2.ID
WHERE   t1.cond = 2
AND     t2.cond = 6

O esto, si ID / cond pares son únicos:

SELECT  ID
FROM    tbl
WHERE   cond IN (2, 6)
GROUP BY ID
HAVING COUNT(cond) = 2

Se puede usar subconsultas y un grupo para hacer esto. Suponiendo que conoce el número de valores que necesita para encontrar, usted puede hacer esto:

select
    t.ID
from
    (
        select distinct
            ID, cond
        from
            tbl
        where
            tbl.cond in (2, 6)
    ) as t
group by
    t.ID
having
    count(t.cond) = 2

En el caso general, sólo tendría que tenga que actualizar la lista de condiciones que deben existir (es decir, "(2, 6)") para incluir los nuevos valores, y luego actualizar la cláusula having (es decir, "tener recuento (t .cond) = 2" ) para igualar el número total de valores.

SELECT DISTINCT(ID) WHERE (cond = 2) OR (cond = 6)

Aquí hay otra sintaxis que es un poco más transparente (aunque no tan performant) acerca de lo que está haciendo.

SELECT DISTINCT ID 
FROM MyTable T
WHERE 
  EXISTS(SELECT ID FROM MyTable T1 WHERE Cond=2 AND T1.ID=T.ID) AND
  EXISTS(SELECT ID From MyTable T2 WHERE Cond=6 AND T2.ID=T.ID)

Esto podría ser un poco más flexible si no hay dups por ID.

SELECT id
FROM tbl 
GROUP BY id
HAVING SUM(CASE cond 
    WHEN 2 THEN 1
    WHEN 6 THEN 1
    ELSE 0 END) > 1

¿Ha pensado en utilizar la cláusula UNION?

SELECT ID de MyTable DONDE cond = 2 UNIÓN SELECT ID de MyTable DONDE cond = 6

También sería de ayuda si se puede especificar el resultado exacto que está buscando. Pero por lo que he entendido, UNIÓN sería el camino a seguir.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top