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 :-)