2010-10-29 4 views
1

La table est constituée de paires d'utilisateurs connectés ensemble. Ce qui suit est un exemple hypothétique:Comment récupérer un cluster d'utilisateurs connectés à partir d'une table de connexions entre deux utilisateurs?

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

En choisissant au hasard un utilisateur de la table (user1 ou user2) Je voudrais récupérer l'ensemble du cluster de connexions auquel appartient l'utilisateur sélectionné. Par exemple, si le d utilisateur est sélectionné la requête (ou un algorithme) doit renvoyer les connexions

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

Est-ce que quelqu'un sait comment former une instruction de requête ou de créer un algorithme pour récupérer le cluster de connexions?

Merci!

+0

est ce SQLServer? –

+0

@Mark Bannister: Oui, SQL Server 2008 –

Répondre

2

En utilisant un CTE récursive, comme ceci:

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 
+0

Brillant! Je vous remercie! –

1

arbres de modélisation et des graphiques plus généraux dans SQL est difficile, mais peut être fait.

Vous pouvez google les mots-clés « partie explosions SQL », et vous trouverez beaucoup de références.

Vous pouvez trouver un moyen de modéliser un problème très similaire dans MySql here.

Questions connexes