Mysql
 sql >> Database >  >> RDS >> Mysql

MySQL Query per trovare amici e numero di amici comuni

Gli amici in comune possono essere trovati unendo la tabella friend_links a se stessa nel campo friend_id in questo modo:

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

Ma tieni presente che questo, nel peggiore dei casi, è essenzialmente quadrare il numero di righe nella tabella friend_links e può facilmente aumentare il tuo server una volta che hai un numero di righe non banale. Un'opzione migliore sarebbe utilizzare 2 sottoquery per ogni utente e quindi unire i risultati di quelli.

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

Inoltre, puoi semplificare la tua tabella friend_links rimuovendo la chiave surrogata link_id e semplicemente facendo (user_id,friend_id) la chiave primaria poiché devono comunque essere univoci.

Modifica:

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

Sto anche pensando che il user_id i vincoli possono essere spostati da WHERE clausola nella JOIN condizioni per ridurre la dimensione del set di dati creato dal self-join e precludere l'uso di sottoquery come nel mio secondo esempio.