Взаимни приятели могат да бъдат намерени, като се присъедини към нея таблицата friend_links в полето friend_id по следния начин:
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
Но имайте предвид, че това в най-лошия случай е по същество квадратиране броя на редовете в таблицата friend_links и може доста лесно да повдигне вашия сървър, след като имате нетривиален брой редове. По-добър вариант би бил да използвате 2 подзаявки за всеки потребител и след това да присъедините резултатите от тях.
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
Освен това можете да опростите таблицата си с Friend_links, като премахнете сурогатния ключ link_id
и просто правим (user_id,friend_id)
първичния ключ, тъй като те така или иначе трябва да са уникални.
Редактиране:
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
Също така мисля, че user_id
ограниченията могат да бъдат преместени от WHERE
клауза в JOIN
условия за намаляване на размера на набора от данни, създаден от самостоятелното присъединяване и предотвратяване на използването на подзаявки, както във втория ми пример.