Vielen Dank schonmal für die Anregungen!
Ich habe in der Zwischenzeit versucht, Alzairmars Ansatz als
Query umzusetzen. Das kam dabei heraus:
SQL-
Query für Verbindungen der Länge 5 (Maximum)
SQL-Code:
SELECT DISTINCT
-- Benötigt wird in diesem Beispiel der Name und die ID des Benutzers
c1.user_iduser AS u1_id, u1.name AS u1_name,
c2.user_iduser AS u2_id, u2.name AS u2_name,
c3.user_iduser AS u3_id, u3.name AS u3_name,
c4.user_iduser AS u4_id, u4.name AS u4_name,
c5.user_iduser AS u5_id, u5.name AS u5_name
FROM
-- u1 ist der erste Benutzer im Kontakte-Pfad (Start), u5 der letzte (Ziel)
`user_has_contact` AS c1,
`user_has_contact` AS c2,
`user_has_contact` AS c3,
`user_has_contact` AS c4,
`user_has_contact` AS c5,
`user` AS u1,
`user` AS u2,
`user` AS u3 ,
`user` AS u4,
`user` AS u5
WHERE
-- Die Namen der Benutzer stehen in der Tabelle 'user'
(c1.user_iduser=u1.iduser) AND (c2.user_iduser=u2.iduser) AND (c3.user_iduser=u3.iduser) AND
(c4.user_iduser=u4.iduser) AND (c5.user_iduser=u5.iduser) AND
-- Der Pfad muss mit dem Start-Benutzer u1 beginnen.
(c1.user_iduser=%s) AND
-- Der Pfad muss über 5 Benutzer (u1..u5) gehen, wobei zwischen u_n und u_n+1 eine
-- "Ist-Kontakt-Von" Beziehung bestehen muss.
(c1.contact_iduser=c2.user_iduser) AND
(c2.contact_iduser=c3.user_iduser) AND
(c3.contact_iduser=c4.user_iduser) AND
(c4.contact_iduser=c5.user_iduser) AND
-- Der Pfad muss mit dem Ziel-Benutzer u5 enden.
(c5.user_iduser=%s) AND
-- Der Pfad darf keine Zyklen enthalten. Die Zusicherung, dass kein User sich
-- selbst als Kontakt haben darf, wurde hier verwendet.
-- Dadurch wird auch verhindert, dass der Ziel-Benutzer an einer anderen Position
-- als dem letzten Pfadelement steht.
(c1.user_iduser!=c3.user_iduser) AND (c1.user_iduser!=c4.user_iduser) AND
(c2.user_iduser!=c4.user_iduser) AND (c2.user_iduser!=c5.user_iduser) AND
(c3.user_iduser!=c5.user_iduser)
Da ich ein Datenbanken/
SQL-Neuling bin, gibt es hier bestimmt noch einiges an Optimierungspotential
Falls jemandem etwas auffällt, nur raus damit!
Dani H.
At Least I Can Say I Tried