MySQLデータベースの列から一意(ユニーク)なレコード数をカウントする方法
MySQLである列に含まれる重複しない(一意の)レコード数を集計したい場合は、集計関数 COUNT(DISTINCT ...) を GROUP BY 句と組み合わせて使用します。これにより、ユーザーごとの投稿メッセージ数のように、グループ単位での一意レコード数を簡単に取得できます。
実際にサンプルを使って確認してみましょう。
1. サンプルテーブルを作成する
まず、以下のコマンドでテーブルを作成します。
mysql> create table DemoTable
(
UserName varchar(100),
UserPostMessage text
);
Query OK, 0 rows affected (0.54 sec)2. レコードを挿入する
次に、INSERT文を使っていくつかのレコードを追加します。
mysql> insert into DemoTable values('Chris','Hi');
Query OK, 1 row affected (0.09 sec)
mysql> insert into DemoTable values('David','Hello');
Query OK, 1 row affected (0.11 sec)
mysql> insert into DemoTable values('Chris','Awesome');
Query OK, 1 row affected (0.16 sec)
mysql> insert into DemoTable values('Chris','Amazing');
Query OK, 1 row affected (0.17 sec)
mysql> insert into DemoTable values('David','Nice Place');
Query OK, 1 row affected (0.11 sec)
mysql> insert into DemoTable values('Chris','Amazing');
Query OK, 1 row affected (0.12 sec)3. テーブルの内容を確認する
SELECT文ですべてのレコードを表示してみます。
mysql> select *from DemoTable;
実行すると、次のような結果が出力されます。
+----------+-----------------+ | UserName | UserPostMessage | +----------+-----------------+ | Chris | Hi | | David | Hello | | Chris | Awesome | | Chris | Amazing | | David | Nice Place | | Chris | Amazing | +----------+-----------------+ 6 rows in set (0.00 sec)
このように、Chrisは「Amazing」という同じメッセージを重複して投稿していることがわかります。
4. 一意のレコード数をカウントするクエリ
ここで本題です。COUNT(DISTINCT ...) を使うことで、重複した値を除外した上でカウントできます。ユーザーごとに一意のメッセージ投稿数を求めるクエリは次の通りです。
mysql> select UserName,count(DISTINCT UserPostMessage) AS NumberOfMessagesPostByUser from DemoTable group by UserName;
実行結果は以下のようになります。
+----------+----------------------------+ | UserName | NumberOfMessagesPostByUser | +----------+----------------------------+ | Chris | 3 | | David | 2 | +----------+----------------------------+ 2 rows in set (0.00 sec)
まとめ
Chrisは合計4件投稿していますが、「Amazing」が重複しているため、一意のメッセージ数は3件としてカウントされました。Davidも同様に2件と正しく集計されています。
このように、COUNT(DISTINCT 列名) と GROUP BY を組み合わせれば、MySQLで特定の列の重複を除外したレコード数を簡単に集計することができます。単純な件数だけでなく、実質的なデータ数を知りたい場合に非常に便利なテクニックなので、ぜひ活用してください。
-
MySQLで列のすべての日時レコードから秒を引く方法
はじめにMySQLでは、INTERVAL演算子を使うことで、DATETIME型の列に格納されたすべての日時レコードから簡単に秒を引くことができます。この記事では、実際の例を通じてその手順をわかりやすく解説します。サンプルテーブルの作成まず、テーブルを作成しましょう。mysql> create table DemoTable833(ArrivalTime datetime);Query OK, 0 rows affected (0.79 sec)レコードの挿入INSERTコマンドを使用して、テーブルにいくつかのレコードを挿入します。mysql> insert into DemoTab
-
MySQLで予約語「from」を列名として使用する方法
MySQLで「from」を列名として使うには? MySQLでは「from」は予約語(リザーブドワード)として登録されているため、そのまま列名として使用するとエラーが発生します。しかし、バッククォート(`` ` ``)で囲むことで、予約語である「from」を列名として扱うことができます。 この記事では、実際にテーブルを作成し、「from」を列名としてデータの挿入や取得を行う手順を解説します。 1. バッククォートを使ってテーブルを作成する まず、列名「from」をバッククォートで囲んでテーブルを作成します。以下のSQLを実行してください。 mysql> create table Demo