Nå, den eneste forespørgsel, der måske virker indtil nu, er Simons... men det er virkelig overkill - sådan en kompleks grim forespørgsel (2 underforespørgsler med 2 fagforeninger!) for så simpel ting, at du skal placere en dusør? :-) Og hvis du har mere end 1000 brugere, vil forespørgslen være langsom som fanden - husk, den er kvadratisk, og på grund af fagforeninger i underforespørgsler ville der næsten ikke blive brugt noget indeks!
Jeg vil foreslå at genoverveje designet igen og tillade 2 duplikerede rækker til et venskab:
id Person1 Person2 status
1 1 2 friend
2 2 1 friend
3 1 3 friend
4 3 1 friend
Du tror måske, at det er ineffektivt, men efter forenkling vil det gøre det muligt at omskrive forespørgslen til simple joins:
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'
som vil være hurtig som helvede! (Glem ikke at tilføje indekser for Person1,2.) Jeg har anbefalet en lignende forenkling (omskrivning underforespørgsler til joins) i andre meget ubehagelige datastrukturer, og det har fremskyndet forespørgslen fra evighed til blitz-øjeblik!
Så det, der kunne have set ud som en stor overhead (2 rækker for ét venskab), er faktisk en stor optimering :-)
Det vil også gøre forespørgsler som "find alle venner af X" meget nemmere. Og der skal ikke bruges flere dusører :-)