2011-07-19 9 views
40

データベース内の別個の値を選択します。簡単な例を紹介しましょう。MYSQLは2列のDISTINCT値を選択します

表:

foo bar 
--- --- 
a c 
c f 
d a 
c a 
f c 
a c 
d a 
a c 
c a 
f c 

の権利、私のSQLがSELECT DISTINCT foo, bar from tableあるとしましょう。問題があるしかし

foo bar 
--- --- 
a c 
c f 
d a 
c a 
f c 

が、彼らは異なる順序になっているだけであることa c/c aの繰り返しがあるということです。これらは私の結果です。私はこれらを選択したくない、私は両方の列から別の値をしたい、助けてください!

+2

これはあなたには、いくつかのインタビューで聞かれている質問です。 :P –

+0

選択された答えとして私はこの質問をupvotingしていません –

答えて

36

非常に非常に邪悪な&悪:

select distinct 
    least(foo, bar) as value1 
    , greatest(foo, bar) as value2 
from table 
+4

このリクエストは悪です。 fooはvalue1とvalue2の両方にあります。 (ちょうどそれをテストした) – UnstableFractal

+0

正しく動作しません。私の最初の選択は '(5、108)'のようなタプルを返しました。第2の数字は収差の大きさで、レコードが本当にそこにあることを確認しなければなりませんでした。 私はselectを実行しましたが、そうではありませんでした。 – Buffalo

7

方法について:

SELECT DISTINCT a.foo,a.bar FROM table a 
LEFT JOIN table b ON a.foo=b.bar and a.bar=b.foo 
WHERE b.foo IS NULL AND b.bar IS NULL 
+0

@KevinBurton 'WHERE'節の' foo'と 'bar'はあいまいです –

1
SELECT DISTINCT foo, bar FROM table WHERE 
CONCAT(',',foo,bar,) NOT IN (SELECT CONCAT(',',bar,foo) FROM table) 
3

あなたは対称閉鎖の反対何かを求めている(私はかどうかを知りませんそれは閉鎖ではないので、特別な名前、逆称的なものがあります)。 2つの異なる列を比較する必要があるようなクロージャーやクロージャーの場合は、結合を使用できます。両方の列が列間で重複しているときに両方の行をフィルタリングしないようにするには、反復を区別し、そのうちの1つを含める方法が必要です。 GROUP BYを使用する方法について

SELECT DISTINCT t1.foo, t1.bar 
    FROM `table` t1 
    LEFT JOIN `table` t2 
     ON t1.foo=t2.bar AND t1.bar=t2.foo 
    WHERE t2.foo IS NULL OR t1.foo <= t1.bar; 
+0

私はOPと似たようなことをしようとしています。良いチュートリアルと解説へのリンクがありますか?私たちは専門用語ではわからないので、私はネット上で見つけようとしています。 – djskinner

3
SELECT 
     foo, bar 
    FROM tableX 
    WHERE foo <= bar 
UNION 
    SELECT 
     bar, foo 
    FROM tableX 
    WHERE bar < foo 
61

どのように?

SELECT foo,bar FROM my_table GROUP BY foo,bar

+2

これははるかに良い解決策です! – Dominique

+2

絶対に良い答えです。 –

+0

この回答は正しいはずです。 –

1

これが私の作品:

SELECT DISTINCT 
LEAST(sub.foo, sub.bar) as value_1 
, GREATEST(sub.foo, sub.bar) as value_2 

FROM 
(SELECT 
a.foo 
,a.bar 
FROM 
table a 
JOIN 
table b 
on a.foo = b.bar 
and a.bar = b.foo) sub 
関連する問題