MySQLでフィールドの値を入れ替える方法
IIDX クリアチェッカー
この弐寺サイトを立ち上げる前、楽曲のデータを収集してデータベース(MySQL)に保存したのだけど、その時DBへ発行するSQL文をミスっていた。
SQL文をミスっていたというよりも、取得したデータの加工をミスった。そのため曲にBPM変化がある曲はBPMの上と下が逆になってた(変化ない曲は問題なし)。これは間違って入れてしまったBPMのMAX、MINのデータを入れ替える必要がある。
最初直そうと思った時すぐにSQL文が思い浮かばなかったんでPHPでデータ取得して入れ替えようと思ったけど、やっぱスマートじゃない。SQL文ひとつ発行するだけでポンと直したい。
SQL文でフィールドの値を入れ替える時、まぁユーザー変数使うよなとは思うんだけど、退避の仕方が分からない。入れ替えするレコードが一つしかないのであればできそうだけど、複数ある場合はどうすりゃいいのかと。
調べてみたらあった。ユーザー変数使えること知ってるなら頭を捻れば出てくるやり方だ。
裏MySQLクエリー入門(19) 応用編5 UPDATE文でカラムの値を入れ替えたい - イノベートな非日常
fooとbarというフィールドの値を入れ替えたいときはこんな感じ。一文でやりたいけどユーザー変数定義してるから二文。
set @hoge = 0; update `hoge_tbl` set `foo` = (@hoge:=`foo`)*0+`bar`, `bar` = @hoge where `foo` < `bar`;
「@hoge:=foo」でfooの内容をユーザー変数に退避、その後@hogeに「*0」をして値を0にし、それにbarを足して(0を加算なんで値は変わらない)fooへ代入。そしてbarには退避したfooの値を代入。これでfooとbarの値を入れ替えることができた!
最初「(@hoge:=`foo`)*0+`bar`」が意味分かんなかった。何だこの構文(^q^)ってなったけど「:=」がユーザー変数への代入って分かればあとは式のとおり。よく見れば何も難しくないSQL文だった。
うーん。自分でこういうの思いつきたいなぁ。