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

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

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

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

SQL

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

Q&A

解決済

1回答

3408閲覧

SQLで重複行を日付の古いレコードを削除したい

takumil

総合スコア9

MySQL

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

SQL

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

0グッド

1クリップ

投稿2021/08/13 10:19

編集2021/08/13 11:30

以下のような商品ごとにタイプ違いデータがあります。

カテゴリーをグループ化して更新日付(update)が違う場合、
古い更新日付のレコードを削除するSQLがわかりません。

重複行を抽出するSQLはできたいのですが、、、ご教示お願いいたします。

SQL

1SELECT 2 * 3FROM 4 table a 5WHERE 6 a.category in ( 7 SELECT 8 b.category 9 FROM 10 table b 11 GROUP BY 12 b.category 13 HAVING 14 COUNT(*) > 1 15 )
idcategorytypeupdateitem
100110012021-01-01商品11
100210022021-02-01商品12
200120012021-02-01商品21
200220022021-02-01商品22
300130012021-03-10商品31
300230022021-03-01商品32
40014001商品41
40024002商品42
500150012021-01-15商品51
500250022021-01-10商品52

削除したいレコードは

idcategorytypeupdateitem
100110012021-01-01商品11
300230022021-03-01商品32
500250022021-01-10商品52

になります。

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

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

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

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

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

Orlofsky

2021/08/13 11:22

質問は修正できます。 > 重複行を抽出するSQLはできたいのですが、 質問に「重複行を抽出するSQL」も追記しては? >ご教授お願いいたします。 教授 → 教示
takumil

2021/08/13 13:20 編集

どうぞよろしくお願いいたします。
takanaweb5

2021/08/14 02:18

MySQLのバージョンはいくつでしょうか?
takumil

2021/08/14 02:25

MySQL5.7になります。
takanaweb5

2021/08/14 02:37

MySQL 8.0以上であれば分析関数を使用してEXISTS を使用しない方法を思いついたのですが、MySQL5.7では使用できませんね。
guest

回答1

0

ベストアンサー

  • idにより行が一意に特定できる (idがprimary key)
  • 同じcategoryのレコードは必ず2つ
  • 同じcategoryの2つのレコードのupdateは両方NULLか両方値が入力されているかのどちらか
  • updateが両方NULLのcategoryは削除対象ではない
  • updateに値が入力されているcategoryについては、よりupdateがより古い行を削除したい

いろいろ明示されていない条件がありそうなので、整理してみましたが、これであっていますか?

であれば、以下のようなレコードで実現できるかと思います (MySQLの制約の関係上、やや複雑なクエリになっています)

SQL

1DELETE 2FROM `table` 3WHERE id IN ( 4 SELECT id 5 FROM ( 6 SELECT id 7 FROM `table` A 8 WHERE EXISTS ( 9 SELECT * 10 FROM `table` B 11 WHERE A.category = B.category 12 AND A.update < B.update 13 ) 14 ) C 15);

投稿2021/08/13 14:21

neko_the_shadow

総合スコア2349

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

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

takumil

2021/08/14 01:26

回答いただきありがとうございます。 要件も書き出していただきありがとうございます。 すべて合っています。 まずは、selectのみ試してみましたが、 数万行のレコードで完了することができませんでした。
neko_the_shadow

2021/08/14 01:45

対象のテーブルのDDLとSELECTのEXPLAINの結果を提示することはできますか?
takumil

2021/08/14 02:22 編集

ありがとうございます。 SELECT * FROM table WHERE id IN ( SELECT id FROM ( SELECT id FROM table A WHERE EXISTS ( SELECT * FROM table B WHERE A.category = B.category AND A.public_date < B.public_date ) ) C ) EXPLANは id,select_type,table,partitions,type,possible_keys,key_len,ref,rows,filtered,Extra 1,PRIMARY,dat_chintai_room_dup,,ALL,PRIMARY,,,,10760,100.00, 1,PRIMARY,A,,eq_ref,PRIMARY,PRIMARY,8,table.id,1,100.00,Using where 4,DEPENDENT SUBQUERY,B,,ALL,,,,,10760,33.33,Using where
neko_the_shadow

2021/08/14 03:38

categoryにインデックスを設定すると改善しないでしょうか? CREATE INDEX idx ON `table` (category);
takumil

2021/08/14 07:44

無事抽出することができ削除対象レコードを絞り込むことができました。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問