Sql

SQL / mysql-distinct / UNIQUEを選択しますが、すべての列を返しますか?



Sql Mysql Select Distinct Unique Return All Columns



解決:

次の方法でグループを探しています。

フィールド1でテーブルグループから*を選択します

これは時折、明確なonステートメントで書くことができます:



テーブルからfield1 *でdistinctを選択します

ただし、ほとんどのプラットフォームでは、他の列の動作が指定されていないため、上記のいずれも機能しません。 (最初はMySQLで機能しますが、それが使用している場合です。)

個別のフィールドをフェッチして、毎回任意の1行を選択することに固執することができます。



一部のプラットフォーム(PostgreSQL、Oracle、T-SQLなど)では、これはウィンドウ関数を使用して直接実行できます。

select * from(select *、row_number()over(partition by field1 order by field2)as row_number from table)as rows where row_number = 1

その他(MySQL、SQLite)では、テーブル全体をそれ自体と結合するサブクエリを作成する必要があるため(例)、お勧めしません。


あなたの質問の言い回しから、あなたが与えられたフィールドとそのような値ごとに異なる値を選択して、同じ行の他のすべての列の値をリストしたいと思うことを理解しています。ほとんどのDBMSは、どちらでもこれを許可しませんDISTINCTも結果が決定されないため、GROUPBY。



このように考えてください:あなたの場合field1が複数回発生しますが、field2が一覧表示されます(field1は2行ですが、の2つの異なる値これらの2行のfield2)。

ただし、集計関数を使用して(表示するすべてのフィールドに対して明示的に)、代わりにGROUPBY明確:

SELECT field1、MAX(field2)、COUNT(field3)、SUM(field4)、.... FROM table GROUP BY field1 

私があなたの問題を正しく理解していれば、それは私がちょうど持っていたものと似ています。 DISTINCTの使いやすさを、すべてのデータに適用するのではなく、指定したフィールドに制限できるようにする必要があります。

集計関数なしでGROUPBYを使用する場合、GROUPBYのどちらのフィールドがDISTINCTファイルになります。

クエリを実行する場合:

SELECT * from table GROUP BY field1;

field1の単一インスタンスに基づいてすべての結果が表示されます。

たとえば、名前、住所、都市のテーブルがあるとします。 1人の人に複数の住所が記録されていますが、その人の1つの住所が必要な場合は、次のようにクエリを実行できます。

SELECT * FROM people GROUP BY name;

その結果、その名前の1つのインスタンスのみがそのアドレスとともに表示され、もう1つのインスタンスは結果のテーブルから省略されます。注意:フィールドにfirstName、lastNameなどのアトミック値がある場合は、両方でグループ化します。

SELECT * FROM people GROUP BY lastName、firstName;

2人の名前が同じで、lastNameでグループ化した場合、そのうちの1人が結果から除外されるためです。あなたはそれらのことを考慮に入れる必要があります。お役に立てれば。