【MySQL】GROUP BY HAVING句で複数回出現する値とその出現回数を表示する方法
テーブル内で複数回出現している値だけを抽出し、その出現回数を一緒に表示したい場合は、GROUP BY句とHAVING句を組み合わせることで実現できます。
この記事では、実際にサンプルテーブルを作成し、重複している値とそのカウント数を取得するクエリの手順を解説します。
1. サンプルテーブルの作成
まず、以下のようにテーブルを作成します。
mysql> create table DemoTable673(
Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
Value int
);
Query OK, 0 rows affected (0.59 sec)2. テストデータの挿入
INSERT文を使って、いくつかのレコードを挿入します。意図的に「10」と「20」を複数回登録している点に注目してください。
mysql> insert into DemoTable673(Value) values(10); Query OK, 1 row affected (0.21 sec) mysql> insert into DemoTable673(Value) values(20); Query OK, 1 row affected (0.18 sec) mysql> insert into DemoTable673(Value) values(10); Query OK, 1 row affected (0.10 sec) mysql> insert into DemoTable673(Value) values(30); Query OK, 1 row affected (0.12 sec) mysql> insert into DemoTable673(Value) values(20); Query OK, 1 row affected (0.09 sec) mysql> insert into DemoTable673(Value) values(10); Query OK, 1 row affected (0.08 sec) mysql> insert into DemoTable673(Value) values(10); Query OK, 1 row affected (0.28 sec)
3. テーブルの内容を確認
SELECT文ですべてのレコードを表示してみましょう。
mysql> select *from DemoTable673;
実行結果は以下の通りです。
+----+-------+ | Id | Value | +----+-------+ | 1 | 10 | | 2 | 20 | | 3 | 10 | | 4 | 30 | | 5 | 20 | | 6 | 10 | | 7 | 10 | +----+-------+ 7 rows in set (0.00 sec)
この時点で、「10」は4回、「20」は2回、「30」は1回だけ出現していることがわかります。
4. 複数回出現する値のみを抽出するクエリ
ここが本題です。値ごとにグループ化したうえで、HAVING句を使って出現回数が2回以上のグループだけを絞り込みます。
mysql> select Id,count(*) as myValue from DemoTable673 group by Value having count(*) > 1;
実行すると、次のような結果が得られます。
+----+---------+ | Id | myValue | +----+---------+ | 1 | 4 | | 2 | 2 | +----+---------+ 2 rows in set (0.00 sec)
クエリのポイント解説
- GROUP BY Value: Value列の同じ値ごとに行をグループ化します。
- count(*) as myValue: 各グループの行数(=出現回数)を「myValue」という別名で取得します。
- HAVING count(*) > 1: 集計後の結果に対して条件を適用し、1回しか出現しない値(この例では「30」)を除外します。
なお、WHERE句ではなくHAVING句を使うのが重要なポイントです。WHERE句は集計前の個々の行に対するフィルタリングに使われるため、COUNT()などの集計関数の結果に対して条件を指定することはできません。集計後の結果を絞り込む際は、必ずHAVING句を使用しましょう。
-
MySQLで結果を日付ごとにグループ化し、重複値の件数を表示するクエリの書き方
はじめにMySQLでは、GROUP BY句とDATE()関数、COUNT()関数を組み合わせることで、日付単位でレコードをグループ化し、重複する値の件数を簡単に集計できます。ここでは、到着日時ごとに乗客コードを集計する例を通して、その具体的な方法を解説します。1. サンプルテーブルの作成まず、以下のSQLを実行してテーブルを作成します。mysql> create table DemoTable1496-> (-> Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,-> PassengerCode varchar(20),-> A
-
MySQLで重複するタプルを検出してカウントを表示する方法
MySQLで重複するタプル(同じ値の組み合わせを持つ行)を検出し、その出現回数を表示するには、GROUP BY句とHAVING句を組み合わせて使用します。この記事では、テーブルの作成から重複検出クエリの実行まで、手順を追って解説します。 サンプルテーブルの作成 まず、デモ用のテーブルを作成します。 mysql> create table DemoTable -> ( -> Id int, -> Name varchar(20) -> ); Query OK, 0 rows affected (0.80 sec) テストデータの挿入