Cóż, jedyne zapytanie, które może działać do tej pory, to zapytanie Simona… ale to prawdziwa przesada — tak złożone, paskudne zapytanie (2 podzapytania z 2 związkami!) dla tak prostej rzeczy, że musisz wyznaczyć nagrodę? :-) A jeśli masz ponad 1000 użytkowników, zapytanie będzie powolne jak diabli - pamiętaj, jest kwadratowe, a ze względu na związki w podzapytaniach prawie żaden indeks nie zostanie użyty!
Proponuję ponownie przemyśleć projekt i zezwolić na 2 zduplikowane wiersze na przyjaźń:
id Person1 Person2 status
1 1 2 friend
2 2 1 friend
3 1 3 friend
4 3 1 friend
Możesz pomyśleć, że to nieefektywne, ale następujące uproszczenie pozwoli przepisać zapytanie do prostych złączeń:
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'
co będzie szybkie jak diabli! (Nie zapomnij dodać indeksów dla Person1,2.) Zaleciłem podobne uproszczenie (przepisanie podzapytania do złączeń) w innej bardzo nieprzyjemnej strukturze danych i przyspieszyło to zapytanie od wieczności do błyskawicznej błyskawicy!
Więc to, co mogło wyglądać na duże obciążenie (2 wiersze na jedną przyjaźń), jest w rzeczywistości dużą optymalizacją :-)
Ponadto znacznie ułatwi to zapytania typu „znajdź wszystkich znajomych X”. I nie trzeba wydawać więcej nagród :-)