Gemensamma vänner kan hittas genom att gå med i tabellen friend_links till sig själv i fältet friend_id så här:
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
Men tänk på att detta, i värsta fall, i grunden är kvadratisk antalet rader i tabellen friend_links och kan ganska enkelt jacka upp din server när du har ett icke-trivialt antal rader. Ett bättre alternativ skulle vara att använda 2 underfrågor för varje användare och sedan slå samman resultaten av dessa.
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
Du kan också förenkla din friend_links-tabell genom att ta bort surrogatnyckeln link_id
och gör bara (user_id,friend_id)
primärnyckeln eftersom de ändå måste vara unika.
Redigera:
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
Jag tror också att user_id
begränsningar kan flyttas från WHERE
satsen i JOIN
villkor för att minska storleken på datamängden som skapas av självanslutningen och utesluta användningen av underfrågor som i mitt andra exempel.