Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MySQL-Abfrage, um Freunde und die Anzahl gemeinsamer Freunde zu finden

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.