Как пройти через эту специфическую модель отношений в SQL? - PullRequest
0 голосов
/ 20 февраля 2019

У меня есть база данных с таблицей «Отношения», которая выглядит следующим образом:

Relations (PersonId1, PersonId2, RelationTypeId)

Первичный ключ: (PersonId1, PersonId2, RelationTypeId)

Существует двадругие таблицы, ссылающиеся на внешние ключи, но это на самом деле не имеет значения.

Таким образом, отношение определяется, например, (Mary, Andre, 3), где 3 будет ссылаться на другую таблицу и будет означать, например, («друг»).").

Мое требование - видеть всех друзей определенного человека, а также друзей друзей, так что не только первый слой, но и второй.

Например, это будетбыть таблицей отношений

Andre   Mary    3
Mary    Carl    3
Chris   James   3 (irrelevent in our case)

Так что я хочу запрос, где у меня есть PersonId Андре и RelationTypeId.Результат должен быть следующим:

Andre   Mary    3
Mary    Carl    3

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

Надеюсь, вы понимаете мой вопрос, заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 05 апреля 2019

Это рекурсивное CTE (общее табличное выражение).Он будет обрабатывать результаты запроса несколько раз, потому что основной запрос SELECT вызывает часть CTE рекурсивно.CTE является частью запроса SELECT (начинается с WITH).Этот код вернет искомые подмножества данных.

Я использую его для повышения эффективности доступа к данным, когда мне нужно, например, выбрать, разбить на страницы или отобразить строки страницы, связанные с определенной страницей, и т. Д.Это работает в действительности для MySQL 8.

0 голосов
/ 20 февраля 2019

Ниже запроса вернется список друзей person1 и их друзей.

select 
   distinct personId2
from 
   relations 
where 
   personId1 in (select distinct personId2 from relations where personId1 = <person_name>) 
or personId1 = <person_name>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...