MySQL
 Computer >> コンピューター >  >> プログラミング >> MySQL

MySQLで一意の値の数を取得する方法:DISTINCTキーワードの使い方

MySQLであるカラムの一意(ユニーク)な値の件数をカウントしたい場合、DISTINCTキーワードを使用します。この記事では、実際にテーブルを作成しながら、DISTINCTを使った一意値のカウント方法を具体的に解説します。

サンプルテーブルの作成

まずは動作確認用のテーブルを作成しましょう。以下のクエリを実行して、IPアドレスごとのアクセス情報を管理するテーブルを作成します。

mysql> create table UniqueCountByIPAddress
    -> (
    -> Id int NOT NULL AUTO_INCREMENT,
    -> UserHits int,
    -> UserIPAddress varchar(50),
    -> PRIMARY KEY(Id)
    -> );
Query OK, 0 rows affected (0.69 sec)

テーブルが正常に作成されました。「Id」は自動採番される主キー、「UserHits」はヒット数、「UserIPAddress」はユーザーのIPアドレスを格納するカラムです。

テストデータの挿入

次に、INSERT文を使ってサンプルデータを挿入します。同じIPアドレスや同じヒット数を持つレコードを意図的に複数登録することで、DISTINCTの効果が分かりやすくなります。

mysql> insert into UniqueCountByIPAddress(UserHits,UserIPAddress) values(10,'127.0.0.1');
Query OK, 1 row affected (0.20 sec)
mysql> insert into UniqueCountByIPAddress(UserHits,UserIPAddress) values(10,'127.0.0.1');
Query OK, 1 row affected (0.20 sec)
mysql> insert into UniqueCountByIPAddress(UserHits,UserIPAddress) values(20,'127.0.0.1');
Query OK, 1 row affected (0.20 sec)
mysql> insert into UniqueCountByIPAddress(UserHits,UserIPAddress) values(20,'127.0.0.1');
Query OK, 1 row affected (0.17 sec)
mysql> insert into UniqueCountByIPAddress(UserHits,UserIPAddress) values(20,'127.0.0.2');
Query OK, 1 row affected (0.13 sec)
mysql> insert into UniqueCountByIPAddress(UserHits,UserIPAddress) values(20,'127.0.0.2');
Query OK, 1 row affected (0.20 sec)
mysql> insert into UniqueCountByIPAddress(UserHits,UserIPAddress) values(30,'127.0.0.2');
Query OK, 1 row affected (0.17 sec)
mysql> insert into UniqueCountByIPAddress(UserHits,UserIPAddress) values(30,'127.0.0.2');
Query OK, 1 row affected (0.28 sec)
mysql> insert into UniqueCountByIPAddress(UserHits,UserIPAddress) values(30,'127.0.0.2');
Query OK, 1 row affected (0.14 sec)

登録データの確認

SELECT文ですべてのレコードを表示し、データが正しく登録されているか確認しましょう。

mysql> select *from UniqueCountByIPAddress;

実行結果は以下のとおりです。

+----+----------+--------------+
| Id | UserHits | UserIPAddress|
+----+----------+--------------+
|  1 |       10 | 127.0.0.1    |
|  2 |       10 | 127.0.0.1    |
|  3 |       20 | 127.0.0.1    |
|  4 |       20 | 127.0.0.1    |
|  5 |       20 | 127.0.0.2    |
|  6 |       20 | 127.0.0.2    |
|  7 |       30 | 127.0.0.2    |
|  8 |       30 | 127.0.0.2    |
|  9 |       30 | 127.0.0.2    |
+----+----------+--------------+

合計9件のレコードが登録されています。同じIPアドレスが複数回出現していることが確認できます。

DISTINCTを使って一意の値をカウントする

それでは本題です。「UserHits」ごとに「UserIPAddress」カラムの一意な値の件数をカウントするには、count(distinct カラム名)を使用し、GROUP BY句と組み合わせます。

mysql> select UserHits,count(distinct UserIPAddress) as TotalHits
   -> from UniqueCountByIPAddress group by UserHits;

実行結果は以下のとおりです。

+----------+-----------+
| UserHits | TotalHits |
+----------+-----------+
|       10 |         1 |
|       20 |         2 |
|       30 |         1 |
+----------+-----------+
3 rows in set (0.05 sec)

結果の解説

この結果から、以下のことが読み取れます。

  • UserHits = 10 の場合:使用されているIPアドレスは「127.0.0.1」のみなので、一意の値は 1件
  • UserHits = 20 の場合:「127.0.0.1」と「127.0.0.2」の2種類が存在するため、一意の値は 2件
  • UserHits = 30 の場合:使用されているIPアドレスは「127.0.0.2」のみなので、一意の値は 1件

このように、COUNT(DISTINCT カラム名) を使うことで、重複を除外した上での件数を簡単に取得できます。アクセスログの分析などで「ユニークユーザー数」を集計したい場合に非常に便利なテクニックですので、ぜひ活用してみてください。

  1. MySQLでテーブル列の重複値の数をカウントするクエリの書き方

    MySQLでは、GROUP BY句とHAVING句を組み合わせることで、テーブルの特定の列に含まれる重複値の数を簡単にカウントできます。この記事では、実際にサンプルテーブルを作成し、重複しているデータの件数を取得する手順を解説します。 1. サンプルテーブルの作成 まず、以下のCREATE TABLE文を使ってテーブルを作成します。 mysql> create table DemoTable( Data int ); Query OK, 0 rows affected (0.98 sec) 2. テーブルへのレコード挿入 次に、INSERT文を使用してサンプルレコードを挿入

  2. 【MySQL】SUM()関数を使って単一クエリで特定の列値ごとの複数カウントを取得する方法

    特定の列値に基づくカウントを1つのMySQLクエリで複数取得するには、集計関数SUM()を活用します。MySQLでは「列 = 値」という条件式が真なら1、偽なら0を返すため、その結果をSUM()で合計することで、条件に一致する行数を数えられます。まずはサンプル用のテーブルを作成しましょう。 mysql> create table DemoTable1790 ( Id int NOT NULL AUTO_INCREMENT PRIMARY KEY, Name varchar(20), Score int ); Query OK, 0 rows af