今回は重複したレコードを抽出するコマンドを書き留めておきます。
SELECT * FROM テーブル名
GROUP BY カラム名
HAVING COUNT(*) >= 2
この構文の注意点は集計関数(GROUP BY)とそれに集計条件を付加するHAVING句の組み合わせです。
それぞれを下記で説明します。
GROUP BY カラム名
このカラムはグループ化の基準列名を書きます。
HAVING
この句の後に、集計結果に対する集計条件を書きます。
HAVING句と同じように条件を記述する句にWHERE句がありますが、それとの違いは、
WHERE句は検索時に絞り込みを行う『検索条件』であるのに対して、
HAVING句は集計後に絞り込みを行う『集計条件』であることです。
以上です!
上記でまとめましたが、後ほど、上司より指摘がありました。
こちらが、正しいですね。
SELECT 重複検索対象カラム名 FROM テーブル名
GROUP BY 重複検索対象カラム名
HAVING COUNT(重複検索対象カラム名) >= 2
こういうことですね、、
idとcompany_idだけからなるappleテーブルを作成
mysql> create table applel(id int, company_id int);
データを流し込み
mysql> insert into apple (id, company_id) values
-> (1,1),
-> (2,1),
-> (3,2),
-> (4,2),
-> (5,3),
-> (6,3),
-> (7,4);
上記のqueryを順に流し込む
mysql> select * from apple;
+------+------------+
| id | company_id |
+------+------------+
| 1 | 1 |
| 2 | 1 |
| 3 | 2 |
| 4 | 2 |
| 5 | 3 |
| 6 | 3 |
| 7 | 4 |
+------+------------+
7 rows in set (0.00 sec)
mysql> select * from apple group by company_id;
+------+------------+
| id | company_id |
+------+------------+
| 1 | 1 |
| 3 | 2 |
| 5 | 3 |
| 7 | 4 |
+------+------------+
4 rows in set (0.00 sec)
mysql> select * from apple group by company_id having count(*) >= 2;
+------+------------+
| id | company_id |
+------+------------+
| 1 | 1 |
| 3 | 2 |
| 5 | 3 |
+------+------------+
3 rows in set (0.00 sec)
company_idは正しいですが、それと一緒にとれるそれ以外のもの(今回のは場合は単純にid)、company_id=1のデータは、id=1とid=2があるが、id=1だけが表示される。
実際のテーブルだとこれの他に名前とか住所などがあるが、それは単にcompany_id=1の中の1レコードに過ぎない。
つまり、実際と異なることがわかります。
つまり、基本的に、group by等で集計を行うときには、group byで指定したカラムかsum,avg,count,min,maxなどの集計用の関数をselectの後ろでは指定するのが基本となります。
mysql> select company_id from apple group by company_id having count(company_id) >= 2;
+------------+
| company_id |
+------------+
| 1 |
| 2 |
| 3 |
+------------+
3 rows in set (0.00 sec)
以上です!
【参考サイト】
『MySQL:重複しているレコードを抽出する』
『SQLで複数行あるデータのみを抽出する方法』
『スッキリわかる SQL 入門 ドリル215問付き! (スッキリシリーズ) 』