Е, единствената заявка, която може да работи до момента, е тази на Саймън... но това е наистина излишно - толкова сложна гадна заявка (2 подзаявки с 2 обединения!) за толкова просто нещо, че трябва да поставите награда? :-) И ако имате около 1000+ потребители, заявката ще бъде адски бавна - запомнете, че е квадратична и поради обединения в подзаявките, едва ли ще се използва някакъв индекс!
Бих предложил да преосмислите дизайна отново и да позволите 2 дублиращи се реда за приятелство:
id Person1 Person2 status
1 1 2 friend
2 2 1 friend
3 1 3 friend
4 3 1 friend
Може да мислите, че това е неефективно, но следното опростяване ще позволи пренаписването на заявката до прости присъединявания:
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'
което ще бъде адски бързо! (Не забравяйте да добавите индекси за Person1,2.) Препоръчал съм подобно опростяване (пренаписване подзаявки към обединения) в друга много неприятна структура от данни и това е ускорило заявката от вечността до блиц-мигновено!
Така че това, което може би изглеждаше като големи режийни разходи (2 реда за едно приятелство), всъщност е голяма оптимизация :-)
Също така, това ще направи заявки като "намерете всички приятели на X" много по-лесни. И няма да е необходимо да се харчат повече награди :-)