Как извлечь кластер подключенных пользователей из таблицы соединений между двумя пользователями? - PullRequest
1 голос
/ 29 октября 2010

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

user1, user2
a, b
a, c
c, a
c, d
d, e
a, e
j, n
g, n
f, n

Случайным образом выбирая пользователя из таблицы (user1 или user2), я хотел бы получить весь кластер соединений, к которому принадлежит выбранный пользователь. Например, если выбран пользователь d, запрос (или алгоритм) должен вернуть соединения

a, b
a, c
c, a
c, d
d, e
a, e

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

Спасибо!

Ответы [ 2 ]

2 голосов
/ 29 октября 2010

Используя рекурсивный CTE, вот так:

with combinedusers as 
(select user1 userX, user2 userY from usertable union
 select user2 userX, user1 userY from usertable)
, relatedusers as 
(select c.userX, 
        c.userY, 
        convert(varchar(max),'\' + c.userX + '\' + c.userY + '\') hierarchy 
        from combinedusers c where userX = 'd' 
 union all
 select c.userX, 
        c.userY, 
        convert(varchar(max),r.hierarchy  + c.userY + '\') hierarchy 
        from combinedusers c 
        join relatedusers r 
        on c.userX = r.userY and charindex('\' + c.userY + '\',r.hierarchy)=0)
select * from
(select userX, userY from relatedusers union 
 select userY, userX from relatedusers) r where userX < userY
1 голос
/ 29 октября 2010

Моделирование деревьев и более общих графов в SQL сложно, но можно сделать.

Вы можете найти в Google ключевые слова "части взрывов SQL", и вы найдете много ссылок.

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

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