Bene, l'unica query che potrebbe funzionare fino ad ora è quella di Simon... ma è davvero eccessivo:una query così complessa e sgradevole (2 sottoquery con 2 unioni!) Per una cosa così semplice che devi piazzare una taglia? :-) E se hai più di 1000 utenti, la query sarà lenta da morire - ricorda, è quadratica e, a causa delle unioni nelle sottoquery, non verrebbe utilizzato quasi nessun indice!
Suggerirei di ripensare di nuovo il design e consentire 2 righe duplicate per un'amicizia:
id Person1 Person2 status
1 1 2 friend
2 2 1 friend
3 1 3 friend
4 3 1 friend
Potresti pensare che sia inefficiente, ma la seguente semplificazione consentirà di riscrivere la query in join semplici:
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'
che sarà veloce come l'inferno! (Non dimenticare di aggiungere gli indici per Person1,2.) Ho consigliato una semplificazione simile (riscrittura subquery a join) in un'altra struttura di dati molto sgradevole e ha velocizzato la query dall'eternità all'istante!
Quindi quello che avrebbe potuto sembrare un grande sovraccarico (2 righe per un'amicizia) è in realtà una grande ottimizzazione :-)
Inoltre, renderà molto più semplici query come "trova tutti gli amici di X". E non dovrai più spendere taglie :-)