3

ここに画像の説明を入力してください

*を使用してテーブルからすべての属性を選択できます。distinctを使用していて、テーブルに16列が含まれています。distinctを使用するにはどうすればよいですか。できませんselect distinct Id,* from abc; 。最善の方法は何でしょうか。別の方法は、個別のid、col1、col2などを選択することです。

4

4 に答える 4

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)これは、組み合わせが一意である限り機能します。

于 2013-02-03T11:10:37.470 に答える
3

個別の代わりにグループ化を使用する

group by col1, col2,col3

それは別のようにやっています

于 2013-02-03T10:38:55.850 に答える
0
SELECT DISTINCT * FROM `some_table`

絶対に有効な構文です。

エラーは、 を呼び出すという事実によって発生しますId, *。Id列も*含まれていますが、通常は一意です。

したがって、あなたの場合に必要なのは次のとおりです。

SELECT DISTINCT * FROM `abc`
于 2013-02-03T10:44:55.267 に答える
-2
    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

于 2013-02-03T10:51:46.993 に答える