Rekan teman dapat ditemukan dengan bergabung dengan tabel friend_links ke dirinya sendiri di bidang friend_id seperti:
SELECT *
FROM friend_links f1 INNER JOIN friend_links f2
ON f1.friend_id = f2.friend_id
WHERE f1.user_id = $person1
AND f2.user_id = $person2
Namun perlu diingat bahwa ini, dalam kasus terburuknya, pada dasarnya adalah mengkuadratkan jumlah baris dalam tabel friend_links dan dapat dengan mudah mendongkrak server Anda setelah Anda memiliki jumlah baris yang tidak sepele. Opsi yang lebih baik adalah menggunakan 2 sub-kueri untuk setiap pengguna, lalu menggabungkan hasilnya.
SELECT *
FROM (
SELECT *
FROM friend_links
WHERE user_id = $person1
) p1 INNER JOIN (
SELECT *
FROM friend_links
WHERE user_id = $person1
) p2
ON p1.friend_id = p2.friend_id
Anda juga dapat menyederhanakan tabel friend_links dengan menghapus kunci pengganti link_id
dan tinggal buat (user_id,friend_id)
kunci utama karena mereka harus unik.
Sunting:
SELECT f2.user_id, COUNT(*) 'friends_in_common'
FROM friend_links f1 LEFT JOIN friend_links f2
ON f1.friend_id = f2.friend_id
WHERE f1.user_id = $person
GROUP BY f2.user_id
ORDER BY friends_in_common DESC
LIMIT $number
Saya juga berpikir bahwa user_id
batasan dapat dipindahkan dari WHERE
klausa ke dalam JOIN
kondisi untuk mengurangi ukuran kumpulan data yang dibuat oleh self-join dan mencegah penggunaan subkueri seperti pada contoh kedua saya.