Mysql
 sql >> Base de données >  >> RDS >> Mysql

Requête MySQL pour trouver des amis et le nombre d'amis communs

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.