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

Consulta MySQL para amigos mutuos

Bueno, la única consulta que podría funcionar hasta ahora es la de Simon... pero eso es realmente exagerado:¿una consulta tan compleja y desagradable (¡2 subconsultas con 2 uniones!) para algo tan simple que necesita colocar una recompensa? :-) Y si tiene más de 1000 usuarios, la consulta será muy lenta. Recuerde, es cuadrática y, debido a las uniones en las subconsultas, ¡casi no se usaría ningún índice!

Sugeriría volver a pensar en el diseño y permitir 2 filas duplicadas para una amistad:

id  Person1    Person2  status
1         1          2  friend
2         2          1  friend
3         1          3  friend
4         3          1  friend

Puede pensar que es ineficiente, pero la siguiente simplificación permitirá reescribir la consulta en uniones simples:

select f1.Person2 as common_friend
from friends as f1 join friends as f2
    using (Person2)
where f1.Person1 = '$id1' and f2.Person1 = '$id2' 
    and f1.status = 'friend' and f2.status = 'friend'

que será rápido como el infierno! (No olvide agregar índices para Person1,2.) He recomendado una simplificación similar (reescribir subconsultas a uniones) en otra estructura de datos muy desagradable y ha acelerado la consulta ¡desde la eternidad hasta el instante!

Entonces, lo que podría haber parecido una gran sobrecarga (2 filas para una amistad) es en realidad una gran optimización :-)

Además, hará consultas como "encontrar a todos los amigos de X" mucho más fáciles. Y no será necesario gastar más recompensas :-)