sql >> Base de Datos >  >> RDS >> Mysql

MySQL Query para encontrar amigos y número de amigos mutuos

Se pueden encontrar amigos mutuos uniendo la tabla friend_links a sí misma en el campo friend_id de la siguiente manera:

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

Pero tenga en cuenta que esto, en el peor de los casos, es esencialmente cuadrar el número de filas en la tabla friend_links y puede conectar fácilmente su servidor una vez que tenga un número no trivial de filas. Una mejor opción sería usar 2 subconsultas para cada usuario y luego unir los resultados de esas.

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

Además, puede simplificar su tabla de enlaces de amigos eliminando la clave sustituta link_id y simplemente haciendo (user_id,friend_id) la clave principal ya que deben ser únicos de todos modos.

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

También estoy pensando que el user_id las restricciones se pueden mover desde WHERE cláusula en JOIN condiciones para reducir el tamaño del conjunto de datos creado por la unión automática y evitar el uso de subconsultas como en mi segundo ejemplo.