2016-01-09 10 views
5

Angenommen, ich habe die folgenden Tabellen:Wählen Sie Zeilen, in denen Feldtabelle gleiche in Verbindung in jeder Zeile ist

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); 

Ich brauche eine Abfrage, die zurückkehren wird:

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

wo id Eltern-ID ist. Die resultierende Tabelle enthält nur die Eltern, die immer (jeden Tag) true. Beachten Sie, dass Eltern ohne Kinder ausgeschlossen werden sollten.

Mein Versuch:

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

Aber es wird auch Eltern geben mit id=2.

Ein weiterer Versuch:

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 

Aber dieser Ansatz auch Eltern sind mit id=5, die ausgeschlossen werden müssen.

Antwort

8

Sie müssen nicht zu den Eltern kommen.

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

Kein anderer Status neben WAHR.

+1

Wenn 'status'' NULL' sein könnte, können Sie 'AND COUNT (*) = COUNT (status)' hinzufügen. –

+0

Danke! Dies ist die einzige Antwort, die in allen Szenarien die richtige Antwort gibt, und sie ist auch die einfachste. – nickbusted

0

könnte diese Arbeit auch

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

Verwendung 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) 

Dies wird Ihnen das gewünschte Ergebnis.

Verwandte Themen