Yah, satu-satunya kueri yang mungkin berhasil hingga saat ini adalah milik Simon... tapi itu benar-benar berlebihan - kueri jahat yang begitu rumit (2 subkueri dengan 2 serikat!) untuk hal yang sangat sederhana sehingga Anda perlu memberikan hadiah? :-) Dan jika Anda memiliki lebih dari 1000 pengguna, kueri akan sangat lambat - ingat, ini kuadrat, dan karena penyatuan dalam subkueri, hampir tidak ada indeks yang akan digunakan!
Saya sarankan untuk memikirkan kembali desainnya dan mengizinkan 2 baris duplikat untuk pertemanan:
id Person1 Person2 status
1 1 2 friend
2 2 1 friend
3 1 3 friend
4 3 1 friend
Anda mungkin berpikir itu tidak efisien tetapi penyederhanaan berikut akan memungkinkan untuk menulis ulang kueri menjadi gabungan sederhana:
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'
yang akan sangat cepat! (Jangan lupa menambahkan indeks untuk Person1,2.) Saya telah menyarankan penyederhanaan serupa (menulis ulang subqueries untuk bergabung) dalam struktur data lain yang sangat buruk dan telah mempercepat kueri dari keabadian hingga sekejap!
Jadi apa yang mungkin terlihat sebagai overhead besar (2 baris untuk satu pertemanan) sebenarnya adalah pengoptimalan besar :-)
Juga, itu akan membuat kueri seperti "temukan semua teman X" jauh lebih mudah. Dan tidak ada lagi hadiah yang perlu dihabiskan :-)