У меня есть сайт социальной сети, созданный на основе структуры Elgg (php + mysql). Моя цель - получить всех друзей данного пользователя, а также установить дружеские отношения между этими друзьями.
Вся необходимая мне информация находится в двух таблицах:
- таблица "пользователи", где пользователи идентифицируются по уникальному идентификатору, называемому guid
- и таблица «отношений», где отношения друзей представлены тройками (guid_one, «friend», guid_two)
Дружеские отношения в Элгге могут быть как односторонними, так и двунаправленными, это больше похоже на отношения «подписки» в Твиттере. Гарантируется уникальность троек отношений.
Краткий пример: учитывая пользователей (1, «Джо»), (2, «Джек») (3, «Джим») и следующие отношения (1, «друг», 2), (2, «друг», 1) , (1, «друг», 3), (2, «друг», 3), это можно интерпретировать как
- Джо и Джек - общие друзья (следите друг за другом)
- За Джимом следуют Джо и Джек.
Я бы хотел получить
- список всех отношений между друзьями для любого данного пользователя
- в порядке убывания количества отношений (т.е. сначала укажите отношения для тех друзей, которые подписаны на большинство моих друзей)
- желательно в одном запросе
Что было бы наиболее эффективным способом сделать это?
ИЗМЕНИТЬ Пока у меня есть это:
SELECT
u1.guid, u1.name, u2.guid, u2.name
FROM
users u1
INNER JOIN relationships r1 ON
(u1.guid = r1.guid_one AND r1.relationship = "friend")
INNER JOIN users u2 ON (r1.guid_two = u2.guid)
INNER JOIN relationships r2 ON
((r2.guid_one = xxx AND r2.guid_two = u1.guid)
OR (r2.guid_two = xxx AND r2.guid_one = u1.guid))
INNER JOIN relationships r3 ON
((r3.guid_one = xxx AND r3.guid_two = u2.guid)
OR (r3.guid_two = xxx AND r3.guid_one = u2.guid))
Где xxx означает руководство пользователя, которое меня интересует. С этим связаны две основные проблемы: он не упорядочен по количеству отношений и очень медленный из-за большого количества объединений. Кроме того, у него есть только односторонние отношения (кто за кем следует из моих друзей) - однако, я думаю, это может быть решено союзом.
Есть идеи по улучшению этого?