2016-06-17 17 views
1

私はLIKESというテーブルを次のように持っています。次のSQLシナリオで重複を避ける方法

enter image description here

あなたはそれが2つの列を持っている見ることができるように。 UserName1、UserName2。この表が含まれている何 は1人がなど例えば

他の者のFacebookのページに従っている場合ジョンボブスページに従った場合は、テーブル内のエントリがある、ということであるとしてジョン、ボブ、ボブがジョンのFacebookのページを以下の場合は、 Bob、Jonと呼ばれるエントリがあります。

だから私は、お互いのプロフィールに従っているすべてのユーザーを見つけ出したいと思います。

私は以下のクエリを持っています。私は与えられたテーブルから

SELECT L1.USERNAME1, L2.USERNAME2 
FROM LIKES L1, 
    LIKES L2 
WHERE L1.USERNAME1=L2.USERNAME2 
    AND L1.USERNAME2=L2.USERNAME1 

最終出力はジョン・ボブ、またはボブ、ジョン、両方ではないでなければなりません重複を削除することはできませんよ。

私のクエリは結果の両方を与え、どのように私はresluts

+3

の私の誤解に対処するためのhaving句を追加しました。しかし、彼/彼女がやりました私が今日見た中で最もカラフルな表のイラストを提供してください。 –

+0

@sstan、データベースはmysql、私はhttps://sketch.io/sketchpad/を使って画像を作成しました:) – KItis

答えて

3

まず、don't use comma-style joinsで重複を削除することができます。その構文は長い間古くなっています。第2に、この場合重複を避ける方法の1つは、結果セットで報告する最初の名前が最初のアルファベット順よりも前に出現するようにすることです。結果セットに表示される名前のペアは、両方のオーダー(たとえば、「Bob」、「Jon」)と(「Jon」、「Bob」)の両方のソース表に表示する必要があるため、これを安全に行うことができます。ここでは、自分のページに従うユーザーの場合に対処する必要はないと仮定しています。例えば:

select * 
from likes L1 
where 
    L1.username1 < L1.username2 and 
    exists (select 1 from likes L2 where L1.username1 = L2.username2 and L1.username2 = L2.username1); 

結果:

username1 username2 
Bob  Jon 

Click hereあなたのサンプルデータを使用して、このアプローチを実証するSQLフィドルのため。

2

それは少しクレイジーに見えますが、これは実際に動作します:

select min(t.username1) as username1, 
     max(t.username2) as username2 
    from likes t 
group by least(t.username1, t.username2), 
     greatest(t.username1, t.username2) 
having count(distinct t.username1) = 2 

SQLFiddle

EDITはOPの質問

+0

巧妙な、そして、それは2つの名前がお互いに異なっているという私の仮定を避けます。 :) –

+0

@sstan、ur答えは、他の人がfacebookのページをたどっていない場所を出力します。 BとBの後に続くAの結果のみを返す必要があり、結果はA、B、Bのいずれかでなければなりません。しかし、AがBに従うだけで、それ以外の方法ではない場合、出力には入りません。 – KItis

+0

@Kltis:ああ、私はその質問を誤解しました。私はあなたが "論理的"重複のないすべての行を望むと思った。それでも、それは面白い運動でした。 – sstan

関連する問題