Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

MySQL Query para encontrar amigos e número de amigos em comum


Amigos mútuos podem ser encontrados juntando a tabela friend_links a si mesma no campo friend_id assim:
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

Mas tenha em mente que isso, na pior das hipóteses, é essencialmente quadrado o número de linhas na tabela friend_links e pode facilmente aumentar seu servidor uma vez que você tenha um número não trivial de linhas. Uma opção melhor seria usar 2 subconsultas para cada usuário e depois juntar os resultados delas.
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

Além disso, você pode simplificar sua tabela friend_links removendo a chave substituta link_id e apenas fazendo (user_id,friend_id) a chave primária, pois eles devem ser exclusivos de qualquer maneira.

Editar:

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

Também estou pensando que o user_id restrições podem ser movidas de WHERE cláusula no JOIN condições para reduzir o tamanho do conjunto de dados criado pelo self-join e impedir o uso de subconsultas como no meu segundo exemplo.