アプリ版:「スタンプのみでお礼する」機能のリリースについて

下記のようなカラムがある時、DBから取得した値を、引数(並べ替え順)に応じて、(同じカラムを)更新するSQL文を教えてください

●カラム
id1 sex1 age1 id2 sex2 age2 id3 sex3 age3 id4 sex4 age4 

●引数例
3
1
2
※1番目が3、2番目が1、3番目が2
・「1の数字が付いたカラムの値」を、「3の数字が付いたカラムの値」で更新したい
・「2の数字が付いたカラムの値」を、「1の数字が付いたカラムの値」で更新したい

●質問
・MySQLだけで処理可能でしょうか?
UPDATE テーブル名 SET id1=(SELECT id3 FROM テーブル名 WHERE id1=id3値),sex2=(SELECT sex3 ……;

・それとも、一度、全ての値を取得して、PHP等で処理するのでしょうか?
UPDATE テーブル名 SET id1=id3値,sex1=sex3値,age1=age3値,id2=id1値 ……;

・他に何か良い方法はあるでしょうか(一旦別テーブル作成後、戻す等)


●環境
MySQL5.1

A 回答 (1件)

動的にSQLを書き換えて実行することはMYSQL単体でも可能です。


(ストアドプロシジャとかで)

頻繁に入れ替えないのなら、それでもいいと思います。
しかし単純なUPDATE文で更新するのの100倍は時間がかかると思います。
(結構めんどくさいですし)

そもそも、テーブルの設計に問題があるように思います。

常に4人のデータが入っているのならまだ、いいのですが
NULL値などがあるとさらに上の処理が煩雑になります

もし、テーブル設計を見直せるなら
table

pk, group, id, age, sex

として
insert時に
idはgroupでグループ化し、count(pk)+1で取得
1つのグループが5人以上にならないようにトリガでチェックをかける
というふうにすれば上のテーブルと同じデータが格納できます。
拡張性も高いです。

で、肝心のUPDATEですが
ちょっとわかりません
まず、3,1,2の順番から
・「1の数字が付いたカラムの値」を、「3の数字が付いたカラムの値」で更新したい
・「2の数字が付いたカラムの値」を、「1の数字が付いたカラムの値」で更新したい
となるのがよくわかりません

予想ですが
・「3の数字が付いたカラムの値」を、「2の数字が付いたカラムの値」で更新したい
というのを書き忘れていて、3次の巡回置換(3つの入換という意味)を表しているのか
つまり1,2,3が3,1,2になるのか…(1)
それとも1,2,3が3,3,3になるのか…(2)
はたまた1,2,3が3,1,3になるのか…(3)

たぶん(3)だと思うのですがそれって意味がないような…。

まあ、どれでもテーブル構造さえ見直せば結構簡単にかけるので
テーブル設計を見直せるならやってみてください
    • good
    • 0
この回答へのお礼

回答ありがとうございました。
アドバイスを元に見直してみますー

お礼日時:2012/11/10 12:39

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!