同テーブルで指定カラム値を相互更新(入替)したい

このQ&Aのポイント
  • MySQLで同テーブルの指定カラムの値を相互に更新する方法を教えてください。
  • 引数によって、特定のカラムの値を入れ替えるSQL文を作成したいです。
  • MySQL5.1環境で処理可能な方法を教えてください。
回答を見る
  • ベストアンサー

同テーブルで指定カラム値を相互更新(入替)したい

下記のようなカラムがある時、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

  • re999
  • お礼率61% (476/777)
  • MySQL
  • 回答数1
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • sava1
  • ベストアンサー率66% (2/3)
回答No.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)だと思うのですがそれって意味がないような…。 まあ、どれでもテーブル構造さえ見直せば結構簡単にかけるので テーブル設計を見直せるならやってみてください

re999
質問者

お礼

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

関連するQ&A

  • 同じテーブル内同士で更新したい

    MySQLバージョン4.1.16を使用しています。 同じテーブル内で、user_idが「aaaa」のnumカラム値を 「bbbb」のnumカラム値でupdateしたいのですが、 次のようなsqlだとエラーが出てしまいます・・・ なんとかしてできる方法はないでしょうか? $sql = "UPDATE users SET num = (SELECT num FROM users WHERE user_id = 'bbbb') WHERE user_id = 'aaaa'"; Error Number: 1093 You can't specify target table 'users' for update in FROM clause テーブル「users」 +----------+---------+ |  user_id  |  num  | +----------+---------+ |  aaaa   |   1   |←成功すれば2になる +----------+---------+ |  bbbb   |   2   | +----------+---------+

  • csvファイルを使ってMySQLのテーブルを更新し

    約2万件ある15個のカラムで構成されるMySQLのテーブルがあります。 このテーブルをcsvファイルを使って更新しようと考えています。 csvファイルにはレコードIDとあるカラムの変更する値の2つのセルで 構成されています。 行数は毎回異なりますが、だいたい300行前後です。 csvファイルの具体的イメージはこんな感じです。 id order ============ 2,  200 4,  10 7,  460 11,  35 MySQLのテーブルの方にも「id」と「order」というカラムが存在します。 java や PHP を使ってやる方法はわかるんですが、プログラムを作成しないで SQLだけで行いたいと考えています。 LOAD DATA LOCAL INFILE などがあることがわかったのですが、レコードを REPLACE  するのではなく、一部のカラムをアップデートしたい、ということです。 どなたか、教えて頂けると助かります。 よろしくお願い致します。

  • どのテーブルのどのカラム???助けて下さい

    会社に入社したばかりなのですが、プログラミングをしています。 で質問なのですが データベースのselect文で ある名称を取ってこないといけないときに どこのテーブルとどこのテーブルのどのカラムとどのカラムが 等しいときの名称を取ってくる様なselect文が作成できません テーブル設計書のカラム名を見ただけではわかりません こういった場合はどうすればいいのでしょうか 設計書とかにどのカラムが等しいときとか どのテーブルのどの名称とか普通そういう資料があるのでしょうか select文の構文は判ってもテーブルの仕様みたいなのがわからないので 対応できません 全然わかりません。助けてください

  • UNIONする際、片方テーブルしかないカラムも利用

    UNIONする際、片方のテーブルしかないカラムも利用したいのですが、どうすればよいでしょうか? ■現状 SELECT tablename, id, level  FROM (   SELECT \'A\' tablename, s.id, s.level FROM A s    UNION ALL   SELECT \'B\' tablename, r.group_id, r.level FROM B r  ) as UNI ■やりたいこと ・テーブルAにしかないカラム「age」も一緒にSELECTしたいのですが、どうすれば良いでしょうか? ・UNIONしたいわけではなく、UNIONした後のレコード同様、「age」カラムもSELECTしたい、という意味です ・UNIONの外側で何かやればいいのかな、と思い試したのですが、うまくいきませんでした

    • ベストアンサー
    • MySQL
  • 複数テーブルから全データ取得する際、同カラムあり

    SELECTで複数テーブルから、全カラム値を取得する際、同名カラムがあったとき、指定テーブルの値を取得したいのですが、どうすれば良いでしょうか? ◆前提 ・テーブル「r1」 ・テーブル「t1」 ・テーブル「u1」 ※「r1」「u1」には、同名カラム「z2」あり ◆やりたいこと ・条件一致する全てのデータを取得したい ・但し、「z2」カラムの値は、「r1」テーブルの値を取得したい ◆現状 $sql="SELECT * FROM (`r1`) JOIN `t1` JOIN `u1` ON `r1`.`tid` = `t1`.`tid` And`r1`.`uid` = `u1`.`uid`"; ◆疑問 3つのテーブルから条件一致するデータを全て取得しているのですが、 「r1テーブル」「u1テーブル」に同じカラム名(z2)があるためか、 取得結果のz2内容が、「u1テーブル」の「z2カラム」値となっています(多分…)。 この時、「r1テーブル」の「z2カラム」を取得するには、どうすれば良いでしょうか? (「r1テーブル」の「z2カラム」だけを単独で取得したいわけではなく、「SELECT * 」結果した際の「z2カラム」の値を「r1テーブル」のものにしたいです)

    • ベストアンサー
    • MySQL
  • 別テーブルのカラムを利用してソートしたい

    別テーブルのカラムを利用してソートしたい MySQLバージョン4.1.16を使用しています。 テーブル「tbl1」をテーブル「tbl2」のcountというカラムを利用して ソートしたいのですが、どのようなSQL文になるのでしょうか? 「tbl2」のidというカラムは外部キーで「tbl1」のidと関係しています。 テーブル「tbl1」 +------+---------+ |   id |  userid  | +------+---------+ |  1  | tanaka  | |  2  | sato   | +------+---------+ テーブル「tbl2」 +------+---------+ |   id |  count  | +------+---------+ |  1  |   10  | |  2  |   3   | +------+---------+ 次のような文かなと思ったのですが、エラーが返ってきます・・・ SELECT * FROM tbl1 ORDER BY (SELECT id FROM tbl2 ORDER BY count)

    • ベストアンサー
    • MySQL
  • テーブルの一部の内容をまとめて、別テーブル上に更新したい

    テーブル(tA)のカラム(cA cB)を入れ替えたいと思っています。 (全カラムではなく、一部分だけの入れ替えです。) そこで、一時テーブルを作成し、  元テーブル→一時テーブル(入れ替え部分だけ)→元テーブル で対象となるカラムを入れ替えようと思いました。 一時テーブルに、カラムを入れ込むまでは出来たのですが、一時テーブルから、元のテーブルに入れ込むSQLがどうしてもわからず、教えていただきたく書き込みました。 行ったSQLとしては、 1)INSERT INTO TEMP(Id,Date,cA,cB) SELECT Id,Date,cA,cB FROM tA WHERE Id=XXXX; 2)UPDATE tA SET cA=(SELECT cA FROM TEMP WHERE Id=XXXX AND tA.Date = TEMP.Date ) WHERE Id=XXXX; といった形で試してみました。 ご教授、宜しくお願いします。

    • ベストアンサー
    • MySQL
  • コラムの値からコラム・テーブルを検索

    プライマリキーが様々なテーブルで別の名前で利用されていると、テーブル同士の関連の全てが把握できずに困っています。以前にコラム名からテーブルを検索する方法を質問したのですが、私が扱っているデータベースでは、プライマリキーがシステムの別の場所で少しだけ異なる名前で利用されていることが多いので、その方法では把握できない関連が出てきます。 具体的には、EMPLOYEES__KEYというEMPLOYEESテーブルのプライマリキーがPERSONALIZE_EMPOYEESというテーブルでPSNLZ_EMP__KEYという名前で使われている状況を考えていただきたいと思います。PSNLZ_EMP__KEYのコラムのレコードは全てEMPLOYEES__KEY内のデータからとられているとします。 以前にselect TABLE_NAME from USER_TAB_COLUMNS where COLUMN_NAME = 'EMPLOYEES__KEY' というSQLで特定のコラムを使っているテーブルを全てリストアップできると教えていただいたのですが、今回のケースでは、同じような内容のコラムなのですが名前が異なるため上記のSQLでは検索できないテーブルがある場合、それをどうやってとってきたらよいのかということです。 コラムの値にtaro, jiro, hanakoなどのようにテーブルまたはシステム内でユニークな値が指定されている場合、コラムの値を指定し、「その値が使われているコラム・テーブルを列挙せよ」というような命令を与えればよいのだということまでは分かりますが、どのようにSQLを書けば良いか教えてください。

  • 特定のカラムが更新されたときのみ、そのレコードを別テーブルへ格納するト

    特定のカラムが更新されたときのみ、そのレコードを別テーブルへ格納するトリガの作成方法を教えてください・ トリガ名:TEST_UPDATE テーブル名:MV_ORACLE_MV_TEST カラム名:ORAPRIME ORACHANGE ORANAME CHANGENAME 対象カラム:CHANGENAME 格納先テーブル:TRITEST_ORACLE_MV_TEST 作成トリガ: CREATE OR REPLACE TRIGGER TEST_UPDATE after update of CHANGENAME on MV_ORACLE_MV_TEST FOR EACH ROW begin INSERT INTO TRITEST_ORACLE_MV_TEST SELECT MV_ORACLE_MV_TEST.ORAPRIME , MV_ORACLE_MV_TEST.ORACHANGe , MV_ORACLE_MV_TEST.ORANAME , MV_ORACLE_MV_TEST.CHANGENAME FROM MV_ORACLE_MV_TEST where MV_ORACLE_MV_TEST.CHANGENAME = :new.CHANGENAME -- commit; commit; end / テーブルMV_ORACLE_MV_TESTのうち、CHANGENAMEカラムが変更(更新)されたレコードのみを、 TRITEST_ORACLE_MV_TESTテーブルに格納したいと思っております。 この時、他のカラムも一緒に格納することが必要でして、 (もしカラムに変更があった場合、そのカラムも変更する。変更されていない場合は元の値を格納する) そのトリガを上記のように書いたのですが、 コンパイルエラーが発生しました。 どの部分が誤っているのか、ご教授願えませんでしょうか

  • SELECT文で、指定カラム以外の全カラムを一括指定って可能でしょうか

    SELECT文で、指定カラム以外の全カラムを一括指定って可能でしょうか? MYSQLサーバのバージョンは5.0.77です。 下記のように「*」を使用して指定テーブルの全カラムを表示する方法がありますが、 SELECT TableName.* FROM TableName 上記の逆で、指定テーブルの指定カラム以外の全カラムを一括指定って可能でしょうか? 例えば下記のような「^」みたいな、又は同等な書き方があれば良いなと思ってまして。 SELECT TableName.^ColumnName1 FROM TableName ちなみに、下記のように一つ一つ表示したいカラムを指定する方法以外です。 SELECT TableName.ColumnName2 , TableName.ColumnName3 FROM TableName よろしくお願いします。

    • ベストアンサー
    • MySQL