Wederzijdse vrienden kunnen worden gevonden door als volgt deel te nemen aan de tabel friend_links voor zichzelf in het friend_id-veld:
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
Maar onthoud dat dit, in het ergste geval, in wezen kwadraat is het aantal rijen in de tabel friend_links en kan je server vrij gemakkelijk opkrikken als je een niet-triviaal aantal rijen hebt. Een betere optie zou zijn om 2 subquery's voor elke gebruiker te gebruiken en dan de resultaten daarvan samen te voegen.
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
U kunt uw tabel friend_links ook vereenvoudigen door de surrogaatsleutel link_id
te verwijderen en maak gewoon (user_id,friend_id)
de primaire sleutel omdat ze toch uniek moeten zijn.
Bewerken:
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
Ik denk ook dat de user_id
beperkingen kunnen worden verplaatst van de WHERE
clausule in de JOIN
voorwaarden om de grootte van de gegevensset die door de self-join is gemaakt, te verkleinen en het gebruik van subquery's uit te sluiten, zoals in mijn tweede voorbeeld.