Domanda

Ho struttura della tabella come questa:

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

Quando ho voglia di selezionare le righe che contengono una o più condizioni i uso o (... QUANDO cond = 2 o cond = 6 GROUP BY ID ...)

Ma come selezionare le righe che contengono più di una condizione simultaneamente raggruppati per ID? Per esempio. quando voglio trovare le righe che contengono cond 2 e 6, si restituisce solo ID 1

Grazie

È stato utile?

Soluzione

Ci sono diversi modi per farlo.

Utilizzando COUNT (più veloce):

  

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

Utilizzando EXISTS (utilizzando cicli annidati, più lenta su tabelle molto grandi, ma meno criptica e più xtensible rispetto alla 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)

Utilizzando GROUP_CONCAT (una variante specifica MySql sul tema COUNT, ma se si vuole mai corrispondenze esatte, per esempio cond = 2 e cond = 6 un altro cond, poi il basso, alterato per leggere SELECT id, GROUP_CONCAT(DISTINCT cond ORDER BY cond) AS conds ... WHERE conds='2,6' eseguirà meglio)

  

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

Altri suggerimenti

È possibile utilizzare un join per questo:

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

O questo, se ID / coppie di cond sono uniche:

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

Si potrebbe utilizzare sottoquery e un gruppo per fare questo. Supponendo che si conosce il numero di valori è necessario trovare, si può fare questo:

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

Per il caso generale, si sarebbe semplicemente necessario aggiornare l'elenco delle condizioni che devono esistere (vale a dire "(2, 6)") per includere i nuovi valori, e quindi aggiornare il clausola having (vale a dire "avere count (t .cond) = 2" ) essere uguale al numero totale di valori.

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

Ecco un altro sintassi che è un po 'più trasparente (anche se non così performante) su ciò che sta facendo.

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)

Questo potrebbe essere un po 'più flessibile se non ci sono dups per id.

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

Avete pensato di usare la clausola UNION?

SELECT MATR DA MyTable WHERE cond = 2 UNIONE SELECT MATR DA MyTable WHERE cond = 6

Sarebbe anche utile se è possibile specificare l'uscita esatta che stai cercando. Ma da quello che ho capito, UNIONE sarebbe la strada da percorrere.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top