*を使用してテーブルからすべての属性を選択できます。distinctを使用していて、テーブルに16列が含まれています。distinctを使用するにはどうすればよいですか。できませんselect distinct Id,* from abc;
。最善の方法は何でしょうか。別の方法は、個別のid、col1、col2などを選択することです。
4 に答える
結果が必要な場合は、 ごとに 1 行id
、 を使用できますGROUP BY id
。ただし、リスト内の他の列を使用することはお勧めできませんSELECT
(MySQL で許可されている場合でも、ANSI
設定On
またはがあるかどうかによって異なりますOff
)。MIN()
、MAX()
、などの集計関数で他の列を使用することをお勧めしますCOUNT()
。MySQL にはGROUP_CONCAT()
、グループの列からすべての値を収集する集計関数もあります。
SELECT
id
, COUNT(*) AS number_of_rows_with_same_id
, MIN(col1) AS min_col1
, MAX(col1) AS max_col1
--
, GROUP_CONCAT(col1) AS gc_col1
, GROUP_CONCAT(col2) AS gc_col2
--
, GROUP_CONCAT(col16) AS gc_col16
FROM
abc
GROUP BY
id ;
クエリ:
SELECT *
FROM abc
GROUP BY id ;
リストに集計されていない結果がありSELECT
、SQL (2003+) で有効であるため、有効な SQL (最大 92) ではありません。それでも、他の列はグループ化列 ( ) に機能的に依存していないため、ここでは無効ですid
。残念ながら、MySQL はそのようなクエリを許可し、機能の依存関係をチェックしません。
したがって、(同じものを持つ多くの行の)どの行id
が返されるか、または-恐ろしい! - 異なる行 (同じ ID を持つ) から結果を取得します。@Andriy がコメントしているように、結果として、以外の列の値はid
任意に選択されます。予測可能な結果が必要な場合は、そのような手法を使用しないでください。
解決策の例: every から 1 行だけid
が必要で、順序付けに使用できる datetime または timestamp (またはその他の) 列がある場合は、次のようにします。
SELECT t.*
FROM abc AS t
JOIN
( SELECT id
, MIN(some_column) AS m -- or MAX()
FROM abc
GROUP BY id
) AS g
ON g.id = t.id
AND g.m = t.some_column ;
(id, some_column)
これは、組み合わせが一意である限り機能します。
個別の代わりにグループ化を使用する
group by col1, col2,col3
それは別のようにやっています
SELECT DISTINCT * FROM `some_table`
絶対に有効な構文です。
エラーは、 を呼び出すという事実によって発生しますId, *
。Id列も*
含まれていますが、通常は一意です。
したがって、あなたの場合に必要なのは次のとおりです。
SELECT DISTINCT * FROM `abc`
SELECT * FROM abc where id in(select distinct id from abc);
You can totally do this.
Hope this helps
Initially I thought it would work for group by is best one. This is same as doing select * froom abc. Sorry guys