2011-10-23 20 views
0

私はいくつかの人からFacebook Likesのデータベースを持っています。多くの "user_id"に重複した "like_id"フィールドがあります。人物Aが人物Bと共通している「like_id」人物の量を見つけるクエリが必要です。複雑なMySQLクエリ - PER_user_idの重複を見つけますか?

このクエリは、データベースに「user_id」が2つしかない場合に比較すると素晴らしいですが、私は第3を加え、それはそれを台無しにする。基本的に、私はほとんど持っている誰が見たい人Aと

SELECT *, 
     COUNT(*) 
    FROM likes 
GROUP BY like_id 
    HAVING COUNT(*) > 1 

誰もが働くかもしれないクエリがあると共通の「好き」?

+0

'LIKES'テーブル用の' CREATE TABLE'ステートメントは、あなたの質問をより良くフレーム化します。 –

答えて

0

私は、これはそれを行うだろうと思う:

SELECT 
    likes_a.user_id, 
    likes_b.user_id 
FROM 
    likes as likes_a JOIN likes as likes_b 
ON 
    likes_a.like_id = likes_b.like_id 
WHERE 
    likes_a.user_id <> likes_b.user_id 

そして、ポストプロセスの結果は、共通の中で最もを持っている人カウントアップします。

+0

これは近いが、それほどではない。私が得ている結果は、10、9、7の好きなものが共通していますが、クエリを実行して2人のユーザーIDを分離すると、6と3が共通しています。 –

+0

私はこれがうまくいかないと思う。結果を後処理する必要があると思います。純粋なSQLでは解決策がないと思います。そうであれば、それは単一のユーザのために働くでしょう(その場合、各ユーザを反復して前処理します)。 – ObscureRobot

1

このSQLは機能するはずです。ユーザーAのuser_idを入れるだけで他のすべてのユーザーと比較して、一致するものを表示する必要があります。トップ5を表示するように変更するか、他に必要な操作を行うことができます。

基本的には、テーブル上で自己結合を行っているが、結合を行うときには別のuser_idだが、「好き」は同じであることを確認することです。次に、他の各user_idのグループを作成し、そのuser_idと同じ金額の金額を合計します。

SELECT all_other_likes.user_id, count(all_other_likes.like_id) AS num_similar_likes 
FROM likes original_user_likes 
JOIN likes all_other_likes 
ON  all_other_likes.user_id != original_user_likes.user_id 
AND  original_user_likes.like_id = all_other_likes.like_id 
WHERE original_user_likes = USER_ID_YOU_WANT_TO_COMPARE 
GROUP BY all_other_likes.user_id 
ORDER BY count(all_other_likes.like_id) DESC 
LIMIT 1; 

使用しているデータベースが不明です。 MS-SQLの場合はSELECT TOP 1を実行する必要がありますが、これは有効なPostgreSQLとMySQLの構文です。

関連する問題