Wzajemnych znajomych można znaleźć, dołączając do siebie tabelę friend_links w polu friend_id w następujący sposób:
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
Pamiętaj jednak, że w najgorszym przypadku jest to zasadniczo kwadrat liczba wierszy w tabeli friend_links i może dość łatwo podkręcić twój serwer, gdy masz nietrywialną liczbę wierszy. Lepszą opcją byłoby użycie 2 podzapytań dla każdego użytkownika, a następnie dołączenie ich wyników.
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
Możesz także uprościć tabelę friend_links, usuwając klucz zastępczy link_id
i po prostu robię (user_id,friend_id)
klucz podstawowy, ponieważ i tak muszą być unikalne.
Edytuj:
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
Myślę też, że user_id
ograniczenia można przenieść z WHERE
klauzulę w JOIN
warunki w celu zmniejszenia rozmiaru zbioru danych utworzonego przez samodołączenie i wykluczenie użycia podzapytań, jak w moim drugim przykładzie.