Выберите родительские записи со всеми детьми в MySQL - PullRequest
1 голос
/ 13 февраля 2012

У меня есть 3 таблицы:

  • родительский
  • дочерний
  • родительский

Существует много-много отношений между родителямии child, реализованные с помощью таблицы соединения родительских элементов.

Я ищу запрос, который даст мне всех родителей для данного списка дочерних идентификаторов.НО - он должен совпадать точно, то есть родитель должен совпадать только в том случае, если у него ТОЧНО заданный набор дочерних идентификаторов, т.е. не меньше, но и не больше (я борюсь с частью «не более»).

У меня есть такое же требование: Выберите родительскую запись со всеми детьми в SQL , за исключением того, что у детей может быть несколько родителей.

Чтобы дать конкретныйпример:

select * from parent

parent_id  name
------------------------------------
1          Parent 1
2          Parent 2

select * from child

child_id  name
------------------------------------
1         Child 1
2         Child 2
3         Child 3

select * from parent_child

parent_child_id  parent_id  child_id
------------------------------------
1                1          1
2                1          2
3                1          3
4                2          1
5                2          3

Т.е. если при предоставлении дочерних идентификаторов 1,2,3 должен возвращаться родительский идентификатор 1 , поскольку только родитель 1 связан со всеми тремя указанными дочерними идентификаторами.

При указании дочерних идентификаторов 1 и 3 необходимо вернуть родительский идентификатор 2 , поскольку только родитель 2 связан с only child 1 и 3

Это мой 1-й вопросздесь - надеюсь, что все в порядке!

1 Ответ

1 голос
/ 13 февраля 2012

Попробуйте:

select parent_id
from parent_child
group by parent_id
having count(child_id) = 2 and
       count(case when child_id in (1,3) then child_id end) = 2

- для набора child_id (1,3). Для набора child_id (1,2,3) соответственно обновите условие in и измените оба условия = 2 на = 3.

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