假设我有以下表格:
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);
我需要一个将返回的查询:
Parents
+------------+
| id |
+------------+
| 1 |
| 3 |
+------------+
其中id
是父母ID。结果表仅包含始终(任何一天)true
的父项。请注意,应排除没有孩子的父母。
我的尝试:
SELECT id
FROM parents p
INNER JOIN children c ON c.parent_id=p.id
WHERE c.status = TRUE
GROUP BY id
但它也会给父母id=2
。
另一次尝试:
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
但是这种方法还包括id=5
的父级,必须将其排除在外。
答案 0 :(得分:8)
您不需要加入父母。
SELECT parent_id
FROM children
GROUP BY parent_id
HAVING MIN(Status) = 'TRUE'
AND MAX(Status) = 'TRUE'
除了TRUE之外没有其他状态。
答案 1 :(得分:1)
SELECT id FROM parent P
WHERE (P.id) IN
(SELECT c.parent_id FROM children c WHERE c.status = TRUE)
这将为您提供所需的结果。
答案 2 :(得分:0)
这可能也有效
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
)
答案 3 :(得分:0)
使用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);