ある列の値を自動的にずらす方法とは?

このQ&Aのポイント
  • バージョン4.1.16を使用している場合、行が削除された際に特定の列の値を前に詰めたい場合、jyunban(順番)という列を使用する方法があります。
  • jyunban列を設け、行が削除された場合、それ以降の行のjyunbanの値を1つ前に繰り上げることができます。
  • ただし、トリガーなどを使用せずに自動的にずらすことは難しいため、jyunban列を使用しない方法で同様の概念を作ることは可能か検討が必要です。
回答を見る
  • ベストアンサー

ある列の値を自動的にずらしたい

バージョン4.1.16を使っています。 jyunban(順番)を設けて、ある行が削除されたら それより後ろにある行全てのjyunbanを1つ前に繰り上げたいです。 id name jyunban 1 鈴木  1 2 吉田  2 3 加藤  3 4 田中  4 5 佐藤  5 6 高橋  6 7 渡辺  7 とあって、例えばid「2」とid「5」を削除した時に jyunbanの値を前に詰めたいのです。 id name jyunban 1 鈴木  1 3 加藤  2 4 田中  3 6 高橋  4 7 渡辺  5 これはトリガーなどを使わないと無理なのでしょうか? それともそもそもjyunban(順番)という列を使わずに これと同じような概念を作ることは可能なのでしょうか?

  • MySQL
  • 回答数4
  • ありがとう数4

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

  • ベストアンサー
  • SUPER-NEO
  • ベストアンサー率38% (706/1857)
回答No.4

こんにちは。 まず、MySQL 4.x シリーズですと希望の動作は、 私の知ってる範囲ではできません。 MySQL 5.x シリーズではストアドプロシージャがサポートされています。 「削除」という操作を、ストアドプロシージャで行い、削除と同時に 順番を更新すればよいのではないでしょうか? 但し、その場合、注意しなければならないのは、同時更新への対応です。 すべてのレコードに対して変更が加えられる可能性がありますから、 Aユーザーが更新中に、Bユーザーが更新した場合に正しく更新されるか、 という点については慎重にテストしなければいけません。

takagoo100
質問者

お礼

ご返答ありがとうございます。 ストアドプロシージャという方法を使ってでも そんなに簡単にうまくいくわけでもなさそうですね・・・ どうもjyunbanの設置には無理がある気がするので 変更を検討していきたいと思います。

その他の回答 (3)

回答No.3

(1)この「順番」は、何のために必要なのですか? (2)データ件数は、最大で何件くらいになりますか? (3)同時にこの表にアクセスするのは、一人だけに限定できますか? (4)「特定データを削除して番号をずらせる」に加え、「あるデータとあるデータを置換」という要件があるとのことですが、「あるデータとあるデータの間に挿入」といった要件も出てくるのでは? (5)バージョン4.1.16では、トリガやストアドプロシジャは使えませんよ?

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.2

変数でやってみてください SET @JYNBAN=0; SELECT id,name,@JYNBAN:=@JYNBAN+1 FROM テーブル ORDER BY id ASC

takagoo100
質問者

お礼

ご返答ありがとうございます。 せっかくお答えして頂いて申し訳ありません。 yambejpさんにも#1へのお礼で説明したことへの 回答を見つけてもらえないでしょうか。

  • calltella
  • ベストアンサー率49% (317/635)
回答No.1

後から空いているidに追加する事はあるんでしょうか? そうでなければidでソートすればいいだけの様な感じがしますが・・・

takagoo100
質問者

お礼

ご返答ありがとうございます。 説明不足で申し訳ありません。順番の入れ替えも行いたいと思ってるので やはりjyunban(順番)という項目を作る必要があると思うのです。 例えば、加藤と高橋の順番を入れ替えると id name jyunban 1 鈴木  1 3 加藤  4 4 田中  3 6 高橋  2 7 渡辺  5 主キーのidは変わらずに、こういう形になると思います。 そうなった場合、2つ(id「2」とid「5」)削除した時に jyunbanも変わっている必要があるので、 そういう変えられるSQL文や、あるいは方法が知りたいです。

関連するQ&A

  • Flexgridで選択行の列の値を取得したい

    いつも参考にさせていただいております。 現在データベースからデータを取ってきてFlexgridに表示するプログラムを作りました。 そのフォームでFlexgridのある行を選択して削除ボタンを押すと、Flexgridの選択した行とデータベースのIDと一致した行を削除するようにしたいと思っています。 しかし、データベースの削除を行うためにFlexgridの選択した行のID列の値を取得しなければならないと思うのですが、どうやって取得すればよいのか分かりません。 どのようにすればよいでしょうか? サンプルなどあればよろしくお願いいたします。 ID  名前  部 ------------------ 01  佐藤  野球 02  鈴木  サッカー  ←例えばこの行を選択したら02を抜き出したい 03  田中  剣道 04  山田  柔道 05  高橋  バレー 環境:Window XP Pro、FlexGrid for .NET 4.0J、SQL Server 2005

  • MYSQLであるレコードを取得したいのですが

    MYSQL5.0.33を使用しています。 今「ID(primary key)」「name」の二つのカラムのテーブルがあり、そのレコードの中から2の倍数と3の倍数のレコードをそれぞれ取得したいのです。 しかし、レコードが削除される可能性があり、なるべく均等に取得することができません。 ================= (例) 1 佐藤 2 鈴木 3 (削除されたレコード) 4 田中 5 小林 6 (削除されたレコード) 7 阿部 8 吉田 9 (削除されたレコード) ================= 上記のような状態ですと、3の倍数のレコードは一つも取得できません。 素人の感覚的な話になってしまうのですが、 ================= (例) 1 佐藤 2 鈴木 3 田中 4 小林 5 阿部 6 吉田 ================= このような感じにして、 「2の倍数は『鈴木』『小林』『吉田』」 「3の倍数は『田中』『吉田』」 で取得はできないものかと思い質問させて頂きました。 できなければ、何か方法や苦肉の策等ありましたらご教授頂けませんでしょうか。 どうか宜しくお願い致します!

  • エクセルで、2つの列を比較して判定する方法。。。

    宜しくお願いします。 2つの列を比較して、判定結果を表示させる方法はないでしょうか? 例えば A         B 田中      加藤 佐藤      志村 吉田      吉田  のような列があった場合、 A列の文字がB列にもあった場合は1 A列の文字がB列になかった場合は0 をかえす式は作れないでしょうか? A         B     C 吉田      加藤     1(”吉田”はB列にあるので1)  佐藤      志村     0(佐藤はB列にないので0) 田中      吉田     0(田中はB列にないので0) やり方を教えてください。 宜しくお願いします。

  • Perl初心者です。同一データを数えるには

    perl 超!初心者です。同一データの数え上げ。 あまり上手く説明できませんがよろしくお願いします。 ある行から行までの同一データを数え上げる処理をしたいです。 例えば、以下のようなデータがあるとします。 --------------------- <NAME> 田中 佐藤 佐藤 山田 田中 <NAME> 佐藤 田中 渡辺 渡辺 佐藤 ------------------- while (<>){ $linecount{$_}++; } foreach $line (sort{$linecount{$b} <=> $linecount{$a}}keys%linecount) { print $linecount{$line}," ",$line if($linecount{$line} >= 1); } これで、行の重複回数と、データを出力はできたのですが、 さらに、<NAME>で区切ってそれぞれの区分で同一データの数を数えていきたいです。結果としては <NAME> 2 田中 2 佐藤 1 山田 <NAME> 2 渡辺 2 佐藤 1 田中 と出力したいのですが、どうすればよいでしょうか?

    • ベストアンサー
    • Perl
  • テーブルの結合・・・

    教室テーブル id, class 1, A組 2, B組 3, C組 生徒テーブル id, name 1, 佐藤 1, 山田 2, 鈴木 3, 田中 3, 後藤 3, 加藤 という二つのテーブルがあります。 これらをLEFT JOINで結合したのですが。 A組, 佐藤 A組, 山田 B組, 鈴木 C組, 田中 C組, 後藤 C組, 加藤 となってしまいます。 これを同じ教室名でまとめて、 A組, 佐藤 山田 B組, 鈴木 C組, 田中 後藤 加藤 というように表示したいのです。 できればクエリだけで解決したいのですが・・・ よろしくお願いします。

    • ベストアンサー
    • MySQL
  • (EXCEL)あるもの一覧

    EXCELでデータベースに存在する値を一つずつ取り出して、並べることって可能ですか? 例) ------------------ 1 佐々木 2 佐々木 3 石田 4 鈴木 5 山田 6 加藤 7 加藤 8 佐藤 9 佐藤 10 佐藤 11 渡辺 12 石田 13 山田 14 佐々木 15 鈴木 16 鈴木 17 鈴木 18 山田 19 山田 20 渡辺 21 佐藤 22 加藤 23 石田 24 佐々木 ----------------------- ↓ ----------------------- 1 佐々木 2 石田 3 鈴木 4 山田 5 加藤 6 佐藤 7 渡辺 ----------------------- 一行だけのピポッドテーブルをつくり、値だけを得ることは可能でしたが、 リアルタイムに変化するものが欲しいので 関数や計算を使ってなんとかできないでしょうか?

  • エクセル表からの抽出して別の表を作る

    探し方が悪いのか、エクセルならできそうなのに答えが見つからず苦戦しています。どなたかお知恵をお貸しください。 1/1   1/2 佐藤 車    自転車 田中 バイク   加藤      バイク 吉田 車    車 山田 自転車  車 伊藤 バイク  車 鈴木 車    自転車 このような一覧表があります。これを基にして、次のような表を作りたいのです。    バイク  車   自転車 1/1  田中   佐藤  山田     伊藤   吉田          鈴木 1/2  加藤   吉田  佐藤          山田  鈴木          伊藤 最初の表は非常に細かく、半年分が1枚のシートになっているため見にくく、月単位で見やすい表に変えているのですが作業が面倒なのでなんとかならないかと考えています。 どうぞよろしくお願いいたします。

  • MySQLで関連したデータを横に並べたい

    こういうテーブル「tb」があるとします。 「tb」 bang nama tuki A103 佐藤 4 A102 高橋 5 A104 鈴木 4 A101 中川 4 A103 渡辺 5 A101 西沢 5 A102 中村 6 A104 田中 5 A103 村井 6 A107 吉田 6 A101 小林 4 これを、実行後に、 bang 4月 5月 6月 A101 中川 西沢 NULL A102 NULL 高橋 中村 A103 佐藤 渡辺 村井 A104 鈴木 田中 NULL A107 NULL NULL 吉田 このように、共通するbangで並べ替えたいのです。 A101の4月は、「中川」と「小林」で重複していますが、 このときはひとりだけが選択されてほしいです。 SELECT CONCAT(CASE WHEN tuki='4' THEN name ELSE IFNULL(null,'') END) AS '4月', ~ GROUP BY bang ~ としても、 bang 4月 5月 6月 A101 中川      となってしまい、5月と6月が上手く表示されません。 よろしくお願いします。

    • ベストアンサー
    • MySQL
  • エクセルで年代別の平均点の求め方について

    エクセルでとある年代毎に得点平均を小数点第一まで求められる関数はどういったものがありますでしょうか。 例)40歳以下の得点の平均  A(名前) B(歳) C(点) 1佐藤 20   60 2鈴木 25 45 3加藤 45 90 4佐々木 80 62 5井上 54 65 6吉田 41 70 7岡田 49 20 8高橋 37 51 9 清水 33 88 10 田中 26 63 使用環境はoffice2007と2003です。

  • Excelでのリストアップ

    佐藤さん、鈴木さん、鈴木さん、高橋さん、田中さん、鈴木さんというデータから 「使われた苗字は佐藤さん、鈴木さん、高橋さん、田中さんの4種類です。」という動作をExcelでしたい時には何かよい方法はありますでしょうか。 のべ、といいますか、この動作をなんと言うか思いつかなかったため調べることが出来ずにいました。 アドバイスを頂けたらと思っております。 宜しくお願いいたします。