No, jediný dotaz, který by zatím mohl fungovat, je Simonův... ale to je opravdu přehnané - tak složitý ošklivý dotaz (2 dílčí dotazy se 2 sjednoceními!) na tak jednoduchou věc, že potřebujete umístit odměnu? :-) A pokud máte více než 1000 uživatelů, bude dotaz pekelně pomalý - pamatujte, že je kvadratický a kvůli sjednocení v poddotazech by se sotva použil žádný index!
Navrhoval bych znovu promyslet design a povolit 2 duplicitní řádky pro přátelství:
id Person1 Person2 status
1 1 2 friend
2 2 1 friend
3 1 3 friend
4 3 1 friend
Možná si myslíte, že je to neefektivní, ale následující zjednodušení umožní přepsat dotaz na jednoduchá spojení:
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'
který bude pekelně rychlý! (Nezapomeňte přidat indexy pro Osoba1,2.) Poradil jsem podobné zjednodušení (přepsání subqueries to joins) v jiné velmi nepříjemné datové struktuře a urychlilo to dotaz od věčnosti do bleskového okamžiku!
Takže to, co mohlo vypadat jako velká režie (2 řady na jedno přátelství), je ve skutečnosti velká optimalizace :-)
Také to usnadní dotazy typu „najít všechny přátele X“. A nebude potřeba utrácet žádné další odměny :-)