2016-01-09 7 views
5

Supponiamo che io abbia le seguenti tabelle:Selezionare righe in cui il campo a far parte di tavolo è lo stesso in ogni riga

CREATE TABLE parents (
    id int primary key 
); 

CREATE TABLE children (
    parent_id int, --id from parents 
    day int, 
    status bool, 
} 

INSERT INTO parents (id) VALUES (1); 
INSERT INTO children (parent_id, day, status) VALUES (1, 1, TRUE); 
INSERT INTO children (parent_id, day, status) VALUES (1, 2, TRUE); 

INSERT INTO parents (id) VALUES (2); 
INSERT INTO children (parent_id, day, status) VALUES (2, 1, TRUE); 
INSERT INTO children (parent_id, day, status) VALUES (2, 2, FALSE); 

INSERT INTO parents (id) VALUES (3); 
INSERT INTO children (parent_id, day, status) VALUES (3, 1, TRUE); 

INSERT INTO parents (id) VALUES (4); 
INSERT INTO children (parent_id, day, status) VALUES (4, 1, FALSE); 

INSERT INTO parents (id) VALUES (5); 

Ho bisogno di una query che restituirà:

Parents 
+------------+ 
| id  | 
+------------+ 
|  1  | 
|  3  | 
+------------+ 

dove id sono i genitori id. La tabella risultante contiene solo i genitori che sempre (qualsiasi giorno) true. Si noti che i genitori senza figli dovrebbero essere esclusi.

Il mio tentativo:

SELECT id 
FROM parents p 
INNER JOIN children c ON c.parent_id=p.id 
WHERE c.status = TRUE 
GROUP BY id 

ma sarà anche possibile dare genitore con id=2.

Un altro tentativo:

SELECT id 
FROM parents p 
LEFT OUTER JOIN children c ON c.parent_id=p.id AND c.status=FALSE 
WHERE c.status IS NULL 
GROUP BY id 

Ma questo approccio comprenderà anche genitore con id=5, che deve essere escluso.

risposta

8

Non è necessario unirsi ai genitori.

SELECT parent_id 
FROM children 
GROUP BY parent_id 
HAVING MIN(Status) = 'TRUE' 
    AND MAX(Status) = 'TRUE' 

Nessun altro stato oltre a VERO.

+1

Nel caso in cui 'status' possa essere' NULL', è possibile aggiungere 'AND COUNT (*) = COUNT (stato)'. –

+0

Grazie! Questa è l'unica risposta che ha dato la risposta corretta in tutti gli scenari ed è anche la più semplice. – nickbusted

0

Questo potrebbe anche funzionare

SELECT DISTINCT p.id 
    FROM parents p 
WHERE p.id IN ( 
       SELECT c.parent_id 
        FROM children c 
        WHERE c.status = TRUE 
        AND c.parent_id = p.id 
       ) 
0

Uso bit_add:

select a.id 
from parents a 
join children b on a.id = b.parent_id 
group by a.id 
having bit_and(b.status); 

sqlfiddle

1
SELECT id FROM parent P 
WHERE (P.id) IN 
(SELECT c.parent_id FROM children c WHERE c.status = TRUE) 

Questo vi darà il risultato desiderato.

Problemi correlati