sql >> データベース >  >> RDS >> Mysql

友達と相互の友達の数を見つけるためのMySQLクエリ

    相互の友達は、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番目の例のようにサブクエリを使用できないようにするための条件。



    1. SQLのmongodb変換INSERT...SELECT

    2. MySQLエラー1005(HY000):テーブル'foo。#sql-12c_4'を作成できません(errno:150)

    3. MariaDBでコンマを使用して数値をフォーマットする

    4. SqlQueryを使用してストアドプロシージャからの複数の結果を処理する