Получение 5-уровневого отношения с одним запросом MySQL - PullRequest
1 голос
/ 05 января 2010

Заранее большое спасибо за ваши ответы. Мне нужно сделать такую ​​вещь

У меня есть таблица дружбы (id, user_id, friend_id, status, timestamp)

Допустим, я пользователь с user_id = 43, и я посещаю пользователя с user_id = 15

В профиле это должна быть линия связи дружбы

Позвольте мне описать ... допустим, у меня дружба с пользователем (user_id = 3, а пользователь с user_id = 3 - друг пользователя, профиль которого я посещаю.

Так что на сайте я увижу

Соединение

MyIcon-> UserIcon (15) -> UserIcon (3) -> UserIcon (я посещаю)

И только в случае, когда статусы дружбы для всех имеют статус = 1 ...

Кто-нибудь может сказать мне, как должен выглядеть запрос?

Ответы [ 3 ]

1 голос
/ 05 января 2010

С простым MySQL нет никакого собственного способа сделать это. Вы должны либо решить, насколько глубоко вы хотите посмотреть, и использовать это количество операций JOIN, чтобы увидеть, можете ли вы «достичь» от одного идентификатора пользователя к другому, либо вы можете дать движок Graph, созданный сообществом:

http://openquery.com/products/graph-engine

(это включает использование неофициального бинарного AFAIK, возможно, он уже доступен как плагин, но я не уверен, что это так)

С этим механизмом вы можете сделать это одним простым запросом:

SELECT * FROM foo WHERE latch = 1 AND origid = 15 AND destid = 43;

И тогда будет возвращаться по одной строке для каждой ссылки, которую вы должны пройти, чтобы перейти от пользователя 15 к пользователю 43. Вы бы использовали код приложения, чтобы красиво отобразить его.

1 голос
/ 05 января 2010

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

Чтобы получить отличную информацию о иерархиях моделирования, просмотрите книгу Джо Селко .

0 голосов
/ 05 января 2010

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

В mySql (ANSI SQL) нет «родного» способа выполнить такой запрос.

...