让我们看一下我们有两个表:
父母(id
INT和孩子(parent_id
INT,priority
INT)
我们有3个父母及其孩子:
Parent_1(id:1)和Child_1(优先级:1)
Parent_2(id:2)和Child_2(优先级:null)
Parent_3(id:3),其中Child_3(优先级:1)和Child_4(优先级:null)
我尝试使用此SQL:
SELECT `parents`.* FROM `parents` LEFT OUTER JOIN `childs` ON `childs`.`parent_id` = `parent`.`id` WHERE `parents`.`id` IN (1, 2, 3) AND (childs.priority != 1 OR childs.priority IS NULL)
因此,我希望结果仅选择Parent_2,因为此处适用于childs.priority != 1
的检查,而此处也适用于检查childs.priority IS NULL
,但它也输出Parent_3,因为Child_4通过了检查childs.priority IS NULL
,但是它不应该显示,因为Child_3没有通过childs.priority != 1
这张支票
答案 0 :(得分:0)
尝试这样的事情:
SELECT *
FROM `parents`
WHERE `id` IN ( 1, 2, 3 )
AND `id` NOT IN ( SELECT DISTINCT `parent_id` FROM `childs` WHERE `childs`.`priority` = 1 )
首先选择priority
值为1的孩子的父母ID,然后选择ID不在列表中的父母...
答案 1 :(得分:0)
您正在做左外部连接,因此所有父母都会出现。
答案 2 :(得分:0)
您可以尝试以下方法:
SELECT `parents`.* FROM `parents` WHERE `parents`.`id` IN (1, 2, 3) AND NOT IN ( SELECT `parents`.`id` JOIN `childs` ON `childs`.`parent_id` = `parent`.`id` WHERE childs.priority IS NOT NULL AND childs.priority = 1)
答案 3 :(得分:0)
我会使用not exists
。您的逻辑有点难以理解。以下返回没有优先级1的孩子的父母:
SELECT p.*
FROM parents p
WHERE NOT EXISTS (SELECT 1
FROM childs c
WHERE c.parent_id = p.id AND
c.priority = 1
) AND
p.id IN (1, 2, 3);
答案 4 :(得分:0)
这是一种有趣的方式。它可能也是最快的。
Select distinct p.parentID
FROM parents p
except
Select distinct c.parentID
FROM childs c
WHERE c.priority = 1