忍者ブログ

エンジニア初心者の備忘録

エンジニア初心者が躓いたことハマったことを公開します!

重複しているレコードを抽出する~プログラム超初心者のためのMySQLコマンド~

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

コメント

ただいまコメントを受けつけておりません。

重複しているレコードを抽出する~プログラム超初心者のためのMySQLコマンド~

今回は重複したレコードを抽出するコマンドを書き留めておきます。

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問付き! (スッキリシリーズ) 』
PR

コメント

プロフィール

HN:
プラムザ 太郎
性別:
非公開

P R