Gemeinsame Freunde können gefunden werden, indem die Tabelle „friend_links“ im Feld „friend_id“ wie folgt mit sich selbst verknüpft wird:
SELECT *
FROM friend_links f1 INNER JOIN friend_links f2
ON f1.friend_id = f2.friend_id
WHERE f1.user_id = $person1
AND f2.user_id = $person2
Aber denken Sie daran, dass dies im schlimmsten Fall im Wesentlichen Quadrieren ist die Anzahl der Zeilen in der Tabelle friend_links und kann Ihren Server ziemlich leicht aufstocken, sobald Sie eine nicht triviale Anzahl von Zeilen haben. Eine bessere Option wäre, 2 Unterabfragen für jeden Benutzer zu verwenden und dann die Ergebnisse dieser zusammenzuführen.
SELECT *
FROM (
SELECT *
FROM friend_links
WHERE user_id = $person1
) p1 INNER JOIN (
SELECT *
FROM friend_links
WHERE user_id = $person1
) p2
ON p1.friend_id = p2.friend_id
Außerdem können Sie Ihre Tabelle "friend_links" vereinfachen, indem Sie den Ersatzschlüssel link_id
entfernen und einfach (user_id,friend_id)
erstellen der Primärschlüssel, da sie ohnehin eindeutig sein müssen.
Bearbeiten:
SELECT f2.user_id, COUNT(*) 'friends_in_common'
FROM friend_links f1 LEFT JOIN friend_links f2
ON f1.friend_id = f2.friend_id
WHERE f1.user_id = $person
GROUP BY f2.user_id
ORDER BY friends_in_common DESC
LIMIT $number
Ich denke auch, dass die user_id
Beschränkungen können von WHERE
verschoben werden -Klausel in JOIN
Bedingungen, um die Größe des durch die Selbstverknüpfung erstellten Datensatzes zu reduzieren und die Verwendung von Unterabfragen wie in meinem zweiten Beispiel auszuschließen.