选择没有具体价值的孩子的父母

时间:2019-05-14 13:33:02

标签: mysql sql mysql-5.6

让我们看一下我们有两个表: 父母(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这张支票

5 个答案:

答案 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