2012-02-09 12 views
1

私のデータベースに友情のレコードを含むテーブルがあります。テーブルには、user1_idとuser2_idという2つの列があり、user1がuser2との友人であることを示しています。これは、user1_idが常に<のuser2_idになるように設定されています。私は、相互の友人の数でソートされたユーザーのペアを返すクエリを作成しようとしています。しかし、結果には友人ではないペアのみを含めることを望みます。ここに私のクエリは、これまでのところです:他のタプルの条件に基づいてタプルを省略します

SELECT af.1, bf.1, count(*) as count 
FROM (SELECT * 
     FROM friends 
     UNION 
     SELECT user2_id, user1_id 
     FROM friends) af, 
    (SELECT * 
     FROM friends 
     UNION 
     SELECT user2_id, user1_id 
     FROM friends) bf 
WHERE af.1 != bf.1 
AND af.2 = bf.2 
GROUP BY af.1, bf.1 
ORDER BY count desc 

これは私の最も共通の友人を持つものによってソートされたユーザーのすべての組み合わせを与える必要があります。しかし、それは実際には自分自身であるペアを含むタプルを省略しません。私はJavaでそれを行うことができますが、私はデータベース側でそれを行うことを好むでしょう。これを行う良い方法はありますか?

+1

どのDBMS? (Oracle、MySQL、SQL Server、PostgreSQL?)まともなものなら、あなたは 'MINUS'を使うことができます。 – ruakh

+0

オラクルですが、設定の違いが私にどのように役立つのか分かりません。私はまず、誰が最も仲良くしているかを見つけようとしています。そして、お互いにすでに友人であるタプルを省略します。 – brianjob

+0

Hmm。ええ、私は 'COUNT(*)'フィールドの存在が 'MINUS'を使うのを難しくしていると思います。あなたが「af.1、bf.1」だけを選択していたなら、それは簡単なことです。 – ruakh

答えて

2
SELECT af.1, bf.1, count(*) as count 
FROM (SELECT * 
     FROM friends 
     UNION 
     SELECT user2_id, user1_id 
     FROM friends) af, 
    (SELECT * 
     FROM friends 
     UNION 
     SELECT user2_id, user1_id 
     FROM friends) bf 
WHERE af.1 != bf.1 
AND af.2 = bf.2 
AND NOT EXISTS (SELECT 1 
       FROM friends 
       WHERE user1_id = af.1 AND user2_id = bf.1 
       OR user1_id = bf.1 AND user2_id = af.1) 
GROUP BY af.1, bf.1 
ORDER BY count desc 
0

CONNECT BY clauseを使用することをお勧めしますが、これは過度の可能性があります。

関連する問題