MySQLのCOUNT関数で重複行を無視する方法を解説
はじめに
はい、COUNT関数とDISTINCTキーワードを組み合わせることで、重複する行を無視することができます。基本的な構文は以下の通りです。
select count(distinct yourColumnName) from yourTableName;
MySQLでは、COUNT()関数は対象の行数を返します。ここにDISTINCTを組み合わせることで、重複する値を除外し、ユニークな(一意の)行だけをカウントできるようになります。
サンプルテーブルを作成する
まず、動作確認用のテーブルを作成しましょう。
mysql> create table DemoTable
(
Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
FirstName varchar(10)
);
Query OK, 0 rows affected (0.47 sec)レコードを挿入する
次に、insertコマンドを使ってテーブルにレコードを追加します。ここでは、意図的に「John」「Larry」「Mike」といった重複する名前を含めています。
mysql> insert into DemoTable(FirstName) values('Larry');
Query OK, 1 row affected (0.18 sec)
mysql> insert into DemoTable(FirstName) values('John');
Query OK, 1 row affected (0.16 sec)
mysql> insert into DemoTable(FirstName) values('Sam');
Query OK, 1 row affected (0.13 sec)
mysql> insert into DemoTable(FirstName) values('John');
Query OK, 1 row affected (0.14 sec)
mysql> insert into DemoTable(FirstName) values('John');
Query OK, 1 row affected (0.10 sec)
mysql> insert into DemoTable(FirstName) values('Larry');
Query OK, 1 row affected (0.15 sec)
mysql> insert into DemoTable(FirstName) values('Mike');
Query OK, 1 row affected (0.16 sec)
mysql> insert into DemoTable(FirstName) values('Robert');
Query OK, 1 row affected (0.13 sec)
mysql> insert into DemoTable(FirstName) values('Carol');
Query OK, 1 row affected (0.13 sec)
mysql> insert into DemoTable(FirstName) values('Mike');
Query OK, 1 row affected (0.12 sec)テーブルの内容を確認する
selectコマンドを実行して、テーブルに登録されたレコードを表示してみます。
mysql> select *from DemoTable;
上記のクエリを実行すると、次のような出力が得られます。
+----+-----------+ | Id | FirstName | +----+-----------+ | 1 | Larry | | 2 | John | | 3 | Sam | | 4 | John | | 5 | John | | 6 | Larry | | 7 | Mike | | 8 | Robert | | 9 | Carol | | 10 | Mike | +----+-----------+ 10 rows in set (0.00 sec)
合計10件のレコードが登録されていますが、「John」が3件、「Larry」と「Mike」がそれぞれ2件含まれているため、重複データが混在している状態です。
DISTINCTで重複を除外してカウントする
COUNTで重複行を無視し、ユニークな行のみを集計するには、以下のようにクエリを記述します。
mysql> select count(distinct FirstName) from DemoTable;
このクエリを実行すると、次のような結果が返されます。
+---------------------------+ | count(distinct FirstName) | +---------------------------+ | 6 | +---------------------------+ 1 row in set (0.03 sec)
まとめ
実行結果として「6」という数値が返されました。これは、全10件のレコードの中に、重複を除いた6つのユニークな名前(Larry、John、Sam、Mike、Robert、Carol)が存在することを意味しています。このように、count(distinct カラム名) を使えば、重複する値を自動的に除外した正確な集計が簡単に行えます。ユーザー数やカテゴリ数など、実際のユニーク件数を知りたい場面でぜひ活用してください。
-
MySQLでGROUP BYとHAVINGを使って重複行を検出する方法
MySQLでテーブル内の重複行を見つけるには、GROUP BY句とHAVING句を組み合わせるのが最も基本的かつ効果的な方法です。この記事では、サンプルテーブルを作成し、実際に重複データを検出する手順をわかりやすく解説します。1. サンプルテーブルの作成まず、出荷日(ShippingDate)と顧客の国名(CustomerCountryName)を持つテーブルを作成します。mysql> create table DemoTable1494-> (-> ShippingDate datetime,-> CustomerCountryName varchar(20)->
-
MySQLで複数のテーブルの行数(COUNT(*))を1つのクエリで取得する方法
MySQLでは、サブクエリを組み合わせることで、複数のテーブルの行数を1つのクエリで同時に取得できます。基本となる構文は以下の通りです。SELECT (SELECT COUNT(*) FROM テーブル名1) AS エイリアス名1, (SELECT COUNT(*) FROM テーブル名2) AS エイリアス名2 FROM dual;構文のポイント各テーブルに対して COUNT(*) を含むスカラーサブクエリを作成し、それらを SELECT 句の中に並べます。MySQLでは FROM dual を指定することで、実際のテーブルを参照しないままサブクエリを評価できます(なお、My