SQL get Parent, где у Children есть определенные значения - PullRequest
0 голосов
/ 05 июня 2018

Дано Parent с полями id и Child, отношение с parent_id и name.Как будет выглядеть запрос, чтобы получить все Parents, которые имеют двух детей, одного с именем «Джон» и одного с именем «Майк».Моя проблема в том, что я не могу создать запрос, который возвращает родителей, имеющих обоих детей.Я использовал Where IN ('John', 'Mike'), поэтому мне возвращают также родителей, у которых также есть один ребенок с именем «Джон» или «Майк».Но я хочу только родителей с обоими детьми.

SELECT * FROM Parent
JOIN Child ON Child.parent_id = Parent.id
WHERE Child.name IN ('John', 'Mike')

Мой запрос, конечно, более сложный, и это только абстракция для того, чего я хочу достичь.Я имею в виду, что сначала мне нужно присоединиться к дочерним элементам parent_id и что-то с этим сделать, но не знаю.

Ответы [ 4 ]

0 голосов
/ 05 июня 2018

Итак, добавили решение с двойным объединением в запрос Ecto и оно прошло мои тесты:)

from c in Child,
join: p in Parent, on: c.parent_id = p.id,
join: cc in Child, on: p.id = cc.parent_id,
where: c.name == ^"John",
where: cc.name == ^"Mike"
select: count(p.id)

Спасибо за идеи и быструю помощь:)

0 голосов
/ 05 июня 2018

Вы можете сделать два объединения и найти свои конкретные записи.Этот пример показывает, что родитель 1 вернется с обоими кидо, но не с родителем 2, у которого есть только Майк.

DECLARE @parent TABLE (ID INT)
DECLARE @child TABLE (ID INT, parentID INT, name VARCHAR(100))

INSERT INTO @parent 
VALUES 
(1),
(2),
(3),
(4),
(5),
(6)

INSERT INTO @child (ID, parentID, name)
VALUES 
(1, 1, 'Mike'),
(2, 1, 'John'),
(3, 2, 'Mike'),
(4, 2, 'Bill'),
(5, 3, 'Dave'),
(6, 4, 'Sam')

SELECT p.*

FROM @parent p

INNER JOIN @child c1
    ON c1.parentID = p.id
    AND c1.name = 'Mike'

INNER JOIN @child c2
    ON c2.parentID = p.ID
    AND c2.name = 'John'
0 голосов
/ 05 июня 2018

что-то вроде этого будет работать в postgres, если у вас есть.

SELECT parent_id, SUM(num) FROM (
  SELECT parent_id, 1 as num FROM Child Where name = 'John'
  UNION
  SELECT parent_id, 1 as num FROM Child Where name = 'Mike'
) parents 
GROUP BY parent_id HAVING SUM(num) = 2 
0 голосов
/ 05 июня 2018

Попробуйте выполнить два шага в предложении where.Оба условия должны быть выполнены, чтобы вернуть родительскую запись.

where parent.id in (select parent_id from child where child.name='John')
and parent.id in (select parent_id from child where child.name='Mike')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...