質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

2回答

41592閲覧

MySQLで、複数フィールドの値が重複するレコードだけ抽出する方法

zico_teratail

総合スコア907

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

2グッド

1クリップ

投稿2015/07/13 05:21

MySQLで、複数フィールドの値が重複するレコードだけ抽出するにはどのようなSQLを投げたらよいでしょうか?
ググると「重複を排除」の例はたくさんありますが、「重複を抽出」の例が少なく質問させていただきました。

たとえば売上表みたいなテーブルがあるとします。
いくつかのフィールドのうち、「顧客ID」「注文日」「フラグ」の3つが同時に同じ値(重複している)のレコードたちだけを抽出したいと考えています。

※本来はこのような重複が存在すること自体がおかしいのですが、テーブル設計時に複合ユニークインデックスを設定し忘れてしまったため、このような重複が存在するテーブルとなっております。

下記のようなSQLを試してみましたが、期待した結果とは全く異なるものになってしまいました。

lang

1SELECT `注文no`,MIN(`顧客ID`), `注文日`,`フラグ` FROM `売上表` 2WHERE `フラグ` = 2 3GROUP BY `顧客ID`,`注文日` 4ORDER BY `注文日`,`注文no`

本来は、

注文no 顧客ID 注文日 フラグ
515 AAA 2015-07-11 2
516 AAA 2015-07-11 2
633 BBB 2015-07-13 2
634 BBB 2015-07-13 2
652 AAA 2015-07-13 2
653 AAA 2015-07-13 2
654 AAA 2015-07-13 2

たとえば上記のような結果が得られることを期待しています。

どんなSQLにしたらいいでしょうか。

tama_yn0815, Himamura👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

kutsulog さんの回答とたいして変わりませんが、こんなかんじじゃないでしょうか?

lang

1SELECT 売上表.* 2FROM 売上表 INNER JOIN ( 3 SELECT 顧客ID, 注文日, フラグ 4 FROM 売上表 5 GROUP BY 顧客ID, 注文日, フラグ 6 HAVING COUNT(*) >= 2 7) TMP 8ON 売上表.顧客ID = TMP.顧客ID 9AND 売上表.注文日 = TMP.注文日 10AND 売上表.フラグ = TMP.フラグ

投稿2015/07/13 05:57

ngyuki

総合スコア4514

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

zico_teratail

2015/07/13 06:11

ありがとうございます、バッチリ解決しました! 自分ではとても思いつくことが出来ませんでした。助かりました。
guest

0

件数を集計して内部結合したらいいのではないでしょうか?

lang

1select 2 注文no 3 , 顧客ID 4 , 注文日 5 , フラグ 6from 売上表 7join ( 8 select 9 注文no 10 , 顧客ID 11 , 注文日 12 , フラグ 13 , COUNT(*) 件数 14 from 売上表 15 group by 16 顧客ID 17 , 注文日 18 , フラグ 19) TMP 20on 売上表.顧客ID = TMP.顧客ID 21and 売上表.注文日 = TMP.注文日 22and 売上表.フラグ = TMP.フラグ 23and TMP.件数 >= 2 24 25

投稿2015/07/13 05:33

kutsulog

総合スコア985

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

zico_teratail

2015/07/13 06:10

ありがとうございます、参考になりました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問