Les amis communs peuvent être trouvés en joignant la table friend_links à elle-même sur le champ friend_id comme ceci :
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
Mais gardez à l'esprit que cela, dans le pire des cas, est essentiellement une mise au carré le nombre de lignes dans la table friend_links et peut facilement augmenter votre serveur une fois que vous avez un nombre non négligeable de lignes. Une meilleure option serait d'utiliser 2 sous-requêtes pour chaque utilisateur, puis de joindre les résultats de celles-ci.
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
De plus, vous pouvez simplifier votre table friend_links en supprimant la clé de substitution link_id
et juste faire (user_id,friend_id)
la clé primaire puisqu'elles doivent être uniques de toute façon.
Modifier :
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
Je pense aussi que le user_id
les contraintes peuvent être déplacées depuis WHERE
clause dans le JOIN
conditions pour réduire la taille de l'ensemble de données créé par l'auto-jointure et empêcher l'utilisation de sous-requêtes comme dans mon deuxième exemple.