Выберите родителей, у которых нет ребенка с определенной ценностью - PullRequest
0 голосов
/ 14 мая 2019

Давайте представим, что у нас есть две таблицы: PARENT (id INT) и CHILD (parent_id INT, priority INT)

У нас есть 3 родителя и их дети:

Parent_1 (id: 1) с Child_1 (приоритет: 1)

Parent_2 (id: 2) с Child_2 (приоритет: ноль)

Parent_3 (id: 3) с Child_3 (priority: 1) и Child_4 (priority: 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 голосов
/ 14 мая 2019

Вот забавный способ.Это также может быть самым быстрым.

Select distinct p.parentID

FROM parents p

except

Select distinct c.parentID

FROM childs c

WHERE c.priority = 1 
0 голосов
/ 14 мая 2019

Я бы использовал 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);
0 голосов
/ 14 мая 2019

Вы делаете левое внешнее объединение, поэтому все родители будут появляться независимо.

0 голосов
/ 14 мая 2019

Вы можете попробовать это:

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)
0 голосов
/ 14 мая 2019

Попробуйте что-то вроде этого:

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. Затем выберите родителей, чей идентификатор отсутствует в списке ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...