Получение 5-уровневого отношения с одним запросом mysql

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

У меня есть таблица дружбы (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(я в гостях)

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

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


person MR.GEWA    schedule 05.01.2010    source источник
comment
Так ты ищешь общих друзей? Или я предполагаю, больше генеалогическое древо. Для создания дерева потребуются рекурсивные функции, mysql не поддерживает рекурсию, postgres и некоторые другие поддерживают.   -  person MindStalker    schedule 05.01.2010
comment
Я не уверен, что один запрос будет хорошей идеей. Что происходит, когда вы посещаете своего друга с user_id=3? Что произойдет, если пользователь, которого вы посещаете, дружит с несколькими вашими друзьями? Что происходит, когда цепочка дружбы длиннее двух прыжков, которые вы описали выше?   -  person Xav    schedule 05.01.2010


Ответы (3)


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

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

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

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

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

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

person Roland Bouman    schedule 05.01.2010

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

Для получения дополнительной информации о моделировании иерархий ознакомьтесь с книгой Джо Селко< /а>.

person Tom H    schedule 05.01.2010

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

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

person Nathan Wheeler    schedule 05.01.2010