teratail header banner
teratail header banner
質問するログイン新規登録
MySQL

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

Q&A

2回答

413閲覧

テーブルの中身の重複したデータがある場合、一つを残して他を削除したい。

退会済みユーザー

退会済みユーザー

総合スコア0

MySQL

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

0グッド

0クリップ

投稿2022/07/07 10:51

編集2022/07/09 04:23

0

0

MySQLバージョン 5.0.95
NAMEテーブル、カラム(id,name)に於いて
1,田中 太郎
2,田中 太郎
3,田中   太郎
4,佐藤 太郎
5,佐藤   太郎
6佐藤 太郎
等あらゆる空白が入った重複するデータが入ったテーブルがあります(どのように空白が入っているかは解らない。半角なのか全角なのか、それらの空白がどれだけ連続するのかも解らない)。
NAMEテーブルの中身を、重複した、空白を無視した状態の文字列を一つ残したまま削除した状態にしたいです。
つまり
変更後
田中 太郎
佐藤 太郎
ようなテーブルに更新(変更、作り直し)したいです。

ただし、一つ残すそのデータにもともと含まれていた空白はそのままにしたいです。田中 太郎でも田中   太郎でも、どれでも良いから一つ空白が入っていたままの状態で残したいです。

考えたことは以下です。
①nameテーブルから全ての空白をreplaceにより詰めたデータを、一時的なテーブルの中に追加する。(newnameというテーブル名)
②newnameの中で重複するデータを見つけてidの若い方を残し、それ以外を削除する。
③nameテーブルに於いてnewnameにあるidと同じidを見つけたら削除する。 という形式でコードを書けば、空白は元のままで重複する余分なデータを削除できるのではないかと考えたのですが、無理はないでしょうか。無理がなければ、 このようなコードはどのようにしたら書けるのでしょうか。

試したコードは

mysql

1create temporary table newname( 2idx int, 3name varchar(255) 4); 5 6INSERT into newname(idx,name) 7select 8 id 9 ,name 10 ,case 11 when instr(name,' ')>0 12 then replace(replace(name,' ',''),' ','') 13 14 when instr(name,' ')>0 15 then replace(replace(name,' ',''),' ','') 16 end as newname 17 from test 18

この段階で1136番のエラが返ってきます。
カラムの数があっていないとあります。idx,nameとid,nameの指定なのでカラムの数は合っていると思うのですが、どこを見落としているのでしょうか。

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

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

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

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

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

yambejp

2022/07/08 01:47

mysql5.0系は使うべきではありません
退会済みユーザー

退会済みユーザー

2022/07/08 03:31 編集

セキュリティの問題でしょうか? 試しに少し使ってみてサービスに幾らかの反響反応があったら、最新のバージョンで、という考えは甘いでしょうか。
yambejp

2022/07/08 04:03

https://www.softagency.co.jp/products/mysql/support まず、サポートがきれていること。最低でも5.7まで上げておかないとなにかあっても自己責任です。 また、かりにスキルでなんとかするとしても機能が少なすぎてちょっと複雑なことをやろうとしてもすぐ手詰まりになります
guest

回答2

0

とりあえずこんな感じ

SQL

1create table tbl(id int primary key,name varchar(30)); 2insert into tbl values 3(1,'田中 太郎'), 4(2,'田中 太郎'), 5(3,'田中   太郎'), 6(4,'佐藤 太郎'), 7(5,'佐藤   太郎'), 8(6,'佐藤 太郎'); 9 10 11select *, 12case 13when instr(name,' ')>0 14then concat(substring_index(name,' ',1) ,' ',substring_index(name,' ',-1) ) 15when instr(name,' ')>0 16then concat(substring_index(name,' ',1) ,' ',substring_index(name,' ',-1) ) 17end as newname 18from tbl

上記を利用して更新して削除

SQL

1update tbl set name=case 2when instr(name,' ')>0 3then concat(substring_index(name,' ',1) ,' ',substring_index(name,' ',-1) ) 4when instr(name,' ')>0 5then concat(substring_index(name,' ',1) ,' ',substring_index(name,' ',-1) ) 6end; 7 8delete from tbl where id in( 9select id from tbl as t1 10where exists(select 1 from tbl where name=t1.name and id<t1.id) 11);

投稿2022/07/08 04:17

yambejp

総合スコア117946

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

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

退会済みユーザー

退会済みユーザー

2022/07/09 01:08

ご回答ありがとうございます。 教えていただいたコードを試してみました。上の例で挙げた名前のテーブルでは問題ないのですが、全角半角が入り混じっているデータやミドルネームがある場合に対応できないのと、後半のコードは1093?番のエラが返ってきます。 そこであれこれ考えてみたのですが、 ①nameテーブルから全ての空白をreplaceにより詰めたデータを、一時的なテーブルの中に追加する。(newnameというテーブル名) ②newnameの中で重複するデータを見つけてidの若い方を残し、それ以外を削除する。 ③nameテーブルに於いてnewnameにあるidと同じidを見つけたら削除する。 という形式でコードを書けば、空白は元のままで重複する余分なデータを削除できるのではないかと考えたのですが、無理はないでしょうか。無理がなければ、 このようなコードはどのようにしたら書けるのでしょうか。 というようにコードを丸々教えてくれという質問はNGかと思うのですが、もちろん自分でも検索してみたのですが、同じ局面に至った人がいないのか、あるいは検索の仕方が悪いのか、中々見つかりません。引き続き自分でも調べているので、お力添え願いたいのです。
退会済みユーザー

退会済みユーザー

2022/07/09 04:27 編集

試したコードです。 create temporary table newname( idx int, name varchar(255) ); INSERT into newname(idx,name) select * id ,name ,case when instr(name,' ')>0 then replace(replace(name,' ',''),' ','') when instr(name,' ')>0 then replace(replace(name,' ',''),' ','') end as newname from test が1136のエラが返ってきました。
guest

0

多分正規表現で半角スペースがエスケープ処理されていないからですね。

投稿2022/07/07 21:46

usekay

総合スコア395

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問