2009-07-16 4 views
2
| one | two | 
------------- 
| A | 1 | 
| A | 2 | 
| B | 1 | 
| B | 3 | 
| C | 1 | 
| C | 4 | 

私は、クエリ内の任意の列に何の反復を取得しないしたいと思いますので、それは、すべての行に個別のを検索するための標準的な SELECT DISTINCT one,two FROM table; またはSELECT * FROM table GROUP BY one,two;は、かなりの仕事をしないものでこの場合は6行すべてが返されます。マルチコラム

理想的には、私が探しています:PHP(など)で

| one | two | 
------------- 
| A | 1 | 
| B | 3 | 
| C | 4 | 

、私はちょうど、各列の配列でこれを行うだろう、とその行をスキップする前に、すべての列が使用されている場合。私はMySQLでそれを実装する方法がわかりません。

SELECT * FROM (SELECT * FROM table GROUP BY one) GROUP BY two - ほとんど動作します。外側のクエリではすべての選択肢が表示されないため、有効なオプションが見つからない、つまりインナーがA、B、Cに崩壊しますが、すべて 1sを2番目のGROUP BY 1行に自分自身を崩壊!

重複チェックの順序は返された正確な行に影響します - それほど気にする必要はありません - 私はちょうど最小限の類似した行を持つ行の良い横断面が必要です。

+1

クエリルールを説明します。同じ 'one 'フィールドを持つ2つの行がある場合、どちらを出力に入れたいのですか? –

+0

あなたの例では最初のマッチである 'A - 1'を選択しましたが、他の2つでは2番目のマッチを選択しました。あなたはどちらかの選択肢を固められますか? –

+0

クレメントの質問に加えて、第1列の「C」がすでに「A」と「B」で発生している第2列の値だけで発生するとどうなりますか? – quosoo

答えて

0

SQLでこれを行う方法はありません:6行(一意のタプルごと)、5行(各列値の最初の使用ごと)または1行(表示される各列の各値の最初の使用ごと両方の列で)。

あなたが望むものを説明するのがとても難しい理由は、それが人間の判断に基づいているからです。質的に英語で説明できるようになるまで、SQLでこれを行うことはできません。あなたが望むものは定性的ではなく、手続き的です。

小数点以下の桁でグループ化し、マッチカウントの逆数でソートするなどの方法がありますが、それらはすべて悪用可能です。

ロジック駆動型の選択基準を明確にするまで、これは成功しません。 "minimal"は最小値を定義するまでカウントされません。必要最小限の値は手続き型集合体behvaiorを必要とします。これはMySQLでは取得できません。まあ

+0

おそらく、間違って行を除外しない場合に最も近いのは です。select distinct * from(select * from foo group by)l union all(select * from foo group by two) –

+0

返事をありがとう、質の高いと手続きの違いを理解していない - これらの用語を読むしようとする... – barryhunter

1

それは私が答えを見つけることが判明したとして、)

CREATE TEMPORARY TABLE table2 ENGINE HEAP SELECT * FROM table;

ALTER IGNORE TABLE table2 ADD UNIQUE (one), ADD UNIQUE (two);

SELECT * FROM table2;

ALTER TABLEでIGNORE、それは単に任意の重複行を破棄して、重要ですユニークなインデックスsに基づいています。

(わからない理由を前に、この考えていなかった - !スタイルのクエリ「でグループの前に順番を」解決するには良い効果にそれを使用されるような)

+0

または実際のクエリのコースは、最初の選択でWHEREとORDER BYを持っている有用。異なる順序で試してみると、RAND()はうまく動作します。 – barryhunter