MySQLのDISTINCTで特定の回数以上出現するフィールドのみを返す方法
特定の回数出現する値だけを取得する方法
MySQLで「2回以上出現する値」のように、特定の回数だけ登場するフィールド(カラムの値)を抽出したい場合は、DISTINCTとCOUNT()、GROUP BY、HAVING句を組み合わせます。基本となる構文は以下の通りです。
select distinct yourColumnName, count(yourColumnName)
from yourTableName
where yourColumnName LIKE 'J%'
group by yourColumnName
having count(*) > 1
order by yourColumnName;
各句の役割は次のとおりです。
- WHERE:抽出対象を絞り込む条件(ここでは「J」で始まる名前)を指定します。
- GROUP BY:同じ値ごとにグループ化します。
- HAVING:グループ化後の出現回数に対して条件(count(*) > 1 など)を指定します。
サンプルテーブルの作成
まず、動作確認用のテーブルを作成しましょう。
mysql> create table DemoTable1500
-> (
-> Name varchar(20)
-> );
Query OK, 0 rows affected (0.86 sec)
レコードの挿入
続いて、INSERTコマンドでサンプルデータを登録します。意図的に同じ名前を複数回登録している点に注目してください。
mysql> insert into DemoTable1500 values('Adam');
Query OK, 1 row affected (0.23 sec)
mysql> insert into DemoTable1500 values('John');
Query OK, 1 row affected (0.09 sec)
mysql> insert into DemoTable1500 values('Mike');
Query OK, 1 row affected (0.09 sec)
mysql> insert into DemoTable1500 values('John');
Query OK, 1 row affected (0.09 sec)
mysql> insert into DemoTable1500 values('Jace');
Query OK, 1 row affected (0.12 sec)
mysql> insert into DemoTable1500 values('Jace');
Query OK, 1 row affected (0.12 sec)
mysql> insert into DemoTable1500 values('Jackie');
Query OK, 1 row affected (0.06 sec)登録データの確認
SELECT文ですべてのレコードを表示してみます。
mysql> select * from DemoTable1500;
実行すると、次のような結果が得られます。「John」と「Jace」がそれぞれ2回登録されていることがわかります。
+--------+
| Name |
+--------+
| Adam |
| John |
| Mike |
| John |
| Jace |
| Jace |
| Jackie |
+--------+
7 rows in set (0.00 sec)
DISTINCTとHAVINGで出現回数を抽出するクエリ
それでは、「J」で始まる名前の中から、2回以上出現するものだけを取り出すクエリを実行します。
mysql> select distinct Name, count(Name)
-> from DemoTable1500
-> where Name LIKE 'J%'
-> group by Name
-> having count(*) > 1
-> order by Name;
このクエリにより、以下の出力が得られます。WHERE句で「J」始まりの名前に絞り込まれ、その中で2回以上登場する「Jace」と「John」だけが返されているのが確認できます。
+------+-------------+
| Name | count(Name) |
+------+-------------+
| Jace | 2 |
| John | 2 |
+------+-------------+
2 rows in set (0.00 sec)
まとめ
重複データの抽出や出現回数の集計は、GROUP BYでグループ化し、HAVINGで回数の条件を指定するのが基本です。DISTINCTを併用することで、重複のない形で名前と出現回数を見やすく表示できます。しきい値を変更したい場合は、having count(*) > 1の数値を調整してください。
-
C#の再帰処理で回転されたソート済み配列から要素を検索する方法
概要回転されたソート済み配列(ローテート・ソート配列)から特定の値を検索するには、通常の二分探索を少し改良した再帰的なアプローチが有効です。ポイントは、中央の要素(最小要素)のインデックスを基準に配列を2つの部分に分け、どちら側に目的の値が存在するかを判定しながら探索範囲を絞り込んでいくことです。アルゴリズムの手順中央要素(最小要素)のインデックスを見つける。以下の条件に基づいて、該当する部分配列に対して二分探索を適用する。検索対象の値が開始要素から mid-1 番目の要素の間に存在する場合、start ~ mid-1 の範囲で二分探索を再帰的に実行する。それ以外で、値が mid ~ 末尾の要
-
C#で文字や文字列を指定した回数だけ繰り返す3つの方法
C#では、特定の文字や文字列を指定した回数だけ繰り返した新しい文字列を作成したい場面がよくあります。本記事では、代表的な3つの実装方法をサンプルコードと出力結果とともに解説します。stringコンストラクタ(new string(charToRepeat, 5))で文字「!」を5回繰り返すstring.Concat(Enumerable.Repeat(...)) で文字を指定回数繰り返すStringBuilder を使ってループで文字列を連結する1. stringコンストラクタを使用する方法string クラスには、同じ文字を指定回数繰り返した文字列を生成できるコンストラクタが用意されています