私のデータベースに友情のレコードを含むテーブルがあります。テーブルには、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でそれを行うことができますが、私はデータベース側でそれを行うことを好むでしょう。これを行う良い方法はありますか?
どのDBMS? (Oracle、MySQL、SQL Server、PostgreSQL?)まともなものなら、あなたは 'MINUS'を使うことができます。 – ruakh
オラクルですが、設定の違いが私にどのように役立つのか分かりません。私はまず、誰が最も仲良くしているかを見つけようとしています。そして、お互いにすでに友人であるタプルを省略します。 – brianjob
Hmm。ええ、私は 'COUNT(*)'フィールドの存在が 'MINUS'を使うのを難しくしていると思います。あなたが「af.1、bf.1」だけを選択していたなら、それは簡単なことです。 – ruakh