ベストアンサー
SQLでは、DISTINCT句を選択リストの***前***で使用できます。出力またはCOUNTなどの集計関数の***内部***で行が重複しないようにするため。 2番目のケース、特にCOUNTの場合、効果は値の繰り返しを1回だけ考慮することです。 1つの解決策は、Greg Kemnitzによって提案された連結を使用することです。ただし、さまざまなSQLエンジンの列タイプと文字列関数に応じた小さな間違いと適応は別として
SELECT COUNT(DISTINCT CONCAT(col1、…。 、col3))FROM table;
簡単な解決策
SELECT COUNT(DISTINCT col1、col2、col3)FROM table;
MySQLで動作しますが、動作しませんDB2で動作し、他のエンジンについては知りませんが、標準のSQLではありません。
操作が頻繁で適切に最適化されている場合により効果的な、別のより複雑なソリューションでは、ビュー
CREATE VIEW vw AS SELECT DISTINCT col1、col2、col3 GROUP BY col1、col2、col3; SELECT COUNT(*)FROM vw;
回答
mysql> create table fake(foo tinyint(3)not null default 0、bar varchar(64)not null default “”) ;クエリOK、影響を受けた0行(0.07秒)
mysql>偽の値に挿入(1、 “foo”)、(1、 “bar”)、(2、 “foo”)、(2、 “bar”)、(3、 “baz”)、(3、 “for”);クエリOK、影響を受ける6行(0.00秒)レコード:6重複:0警告:0
mysql> foo、barによる偽のグループからfoo、bar、count(*)を選択します。 + —– + —– + ———- + | foo |バー| count(*)| + —– + —– + ———- + | 1 |バー| 1 | | 1 | foo | 1 | | 2 |バー| 1 | | 2 | foo | 1 | | 3 |バズ| 1 | | 3 |のために| 1 | + —– + —– + ———- + 6行セット(0.00秒)
mysql>偽の値に挿入(1、 “foo “)、(1、” bar “)、(2、” foo “)、(2、” bar “)、(3、” baz “)、(3、” for “);クエリOK、影響を受ける6行(0.00秒)レコード:6重複:0警告:0
mysql> foo、barによる偽のグループからfoo、bar、count(*)を選択します。 + —– + —– + ———- + | foo |バー| count(*)| + —– + —– + ———- + | 1 |バー| 2 | | 1 | foo | 2 | | 2 |バー| 2 | | 2 | foo | 2 | | 3 |バズ| 2 | | 3 |のために| 2 | + —– + —– + ———- + 6行セット(0.00秒)
mysql>