相互の友達は、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
また、代理キーlink_id
を削除することで、friend_linksテーブルを簡略化できます。 (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
への句 自己結合によって作成されたデータセットのサイズを縮小し、2番目の例のようにサブクエリを使用できないようにするための条件。