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行すべてが返されるためです。

理想的には、私は探しています:

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

PHP(など)では、各列の配列を使用してこれを実行します。以前に列が使用されていた場合は、その行をスキップします。ただし、MySQLでそれを実装する方法はわかりません。

SELECT * FROM (SELECT * FROM table GROUP BY one) GROUP BY two-ほとんど動作します。ただし、外部クエリではすべての選択肢が表示されないため、有効なオプションが失われます。つまり、内部クエリはA、B、Cに折りたたまれますが、列2のすべての1を選択できます。つまり、2番目のGROUPBYが折りたたまれます。 1列に所有します!

重複チェックの順序が、返される正確な行に影響を与えることはわかっていますが、心配する必要はありません。類似した行が最小限の行の断面が適切である必要があります。

4

2 に答える 2

0

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

あなたが何を望んでいるかを説明するのにこれほど苦労している理由は、それが人間の判断に基づいているからです。英語で定性的に記述できるようになるまで、SQL でこれを行うことはできません。必要なのは定性的ではなく、手続き型です。

小さい列でグループ化し、逆に一致数でソートするなど、近似する方法はたくさんありますが、それらはすべて悪用可能です。

選択のための明確で論理的な基準を与えることができるまで、これは成功しません。「最小限」と言うのは、最小限を定義するまではカウントされません。必要に見える最小限には、MySQLでは取得できない手続き型の集約動作が必要です。

于 2009-07-23T22:30:14.500 に答える