質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
MySQL

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

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

Q&A

3回答

268閲覧

行を削除した時、値が繰り下げされるようにしたい

yuyasato0220

総合スコア13

MySQL

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

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

0グッド

1クリップ

投稿2018/11/29 07:36

やりたい事

①他の文字列を変更した時、sortが変動しないようにしたい


sort name
1 ライス      1ライス
2 ラーメン   →  2ラーメン
3 スープ      3コーンスープ
4 おそば      4おそば

補足:現状、何かしらの変更を加えると、sortの値が何故か増えていってしまうのです・・・

②行を削除した時、sortが繰り下げされるようにする
(1,2,3,4,5 のうち、3を削除した時、 4,5が繰り下がり、1234となるようにする)


sort name
1 ライス      1 ライス
2  ラーメン     2 ラーメン
3  野菜     →  3 スープ
4  スープ      4 おそば
5  おそば

テーブルのsort 1,2,3,4,5 とした時
2を更新し、4に変更した時、3が2に 4が3に、 2が4になるようにする


1 ライス      1 ライス
2  ラーメン     2 野菜
3  野菜     →  3 スープ
4  スープ      4 ラーメン   
5  おそば      4 おそば

テーブルのsort 1,2,3,4,5 とした時
3を更新し、1に変更した時、1が2に 2が3に 3が1になるようにする

1 ライス      1 野菜
2  ラーメン     2 ライス
3  野菜     →  3 ラーメン
4  スープ      4 スープ 
5  おそば      5 おそば

ソース

public function updateSort($id, $sort, $old_sort,$delete = false){

$query = $this->model ->where('sort', '>=', $sort) ->where('id', '<>', $id); if($delete === false){ $query->update(['sort'=>DB::raw('sort+1')]); }else{ $query->update(['sort'=>DB::raw('sort-1')]); }

これを使って、こんな感じで実装したいのですが、当方初心者のためもあり、
実現させたい動きになりません。
ご教授の程、宜しくお願い致します。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2018/11/29 08:20

nameを取得するのにsortの番号を指定して表示するってことは考えないシステムなのかな? Aさんがsort=3のnameを取得して、しばらくしてからBさんがsort=3のnameを取得しても、おなじnameにならない可能性がある仕組みだよね。nameの重複も考慮しない感じですか?
yuyasato0220

2018/11/30 01:51

>>Orlofsky様 失礼致しました。以後気をつけさせていただきます。ありがとうございます
yuyasato0220

2018/11/30 01:54

>>m6u 様 mysql・・・そもそも全般知識がない状態で挑んでいる状況でして・・・申し訳ないです。 頂いた内容を参考にやってみようと思います・・・ありがとうございます。 nameに関しては重複などは大丈夫なんですが。。そもそも簡単にサンプル書いてしまったのが間違いですよね・・・ ECサイトの商品管理マスタをつくってまして;;;ありがとうございます
Orlofsky

2018/11/30 01:59

今から直しては?ここの掲示板はいちど書いた質問も回答も修正できます。
guest

回答3

0

PHPは分かりませんが、ロジックは以下になると思います。
削除の場合
・削除したsort以降を-1する

SQL

1update model set sort=sort-1 where sort>[削除したsort]

変更の場合
・変更前および変更後の区間のsortを変更する
その際、変更後の値以上は+1、値未満は-1

SQL

1update model set sort=sort + case when sort<[変更後のsort] then -1 else 1 end 2where sort between [変更前sort] and [変更後sort]

※削除する場合を、[削除したsort]=[変更前sort]、[sortがとりうる値の最大値]=[変更後sort]
とすれば、後半のロジックのみで同じ挙動になります。

投稿2018/11/29 08:06

sazi

総合スコア25188

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

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

0

  • まず、sortを詰める必要はない

つまりsortは大きいか小さいかだけ判断すればよいのでいちいち詰めていては無駄

  • sortがかぶる場合はどちらが優先されるか明示的に指定しない限り結果はわかりません

sortカラムをdoubleなどにして2→4ではなく2→3.5のようにかぶらないようにしてください

test

SQL

1create table tbl (id int primary key,sort double,name varchar(20)); 2insert into tbl values 3(1,1,'ライス'), 4(2,2,'ラーメン'), 5(3,3,'野菜'), 6(4,4,'スープ'), 7(5,5,'おそば');

SQL

1delete from tbl where id=3; 2update tbl set sort=(select @a:=@a+1 from (select @a:=0) as dummy) order by sort; 3 4insert into tbl values(6,1.5,'うどん'); 5update tbl set sort=(select @a:=@a+1 from (select @a:=0) as dummy) order by sort; 6 7update tbl set sort=3.5 where name='ライス'; 8update tbl set sort=(select @a:=@a+1 from (select @a:=0) as dummy) order by sort;

投稿2018/11/30 02:39

yambejp

総合スコア114829

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

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

0

前後の処理含めてやりたいことを書かないと誰にも分からない。

数値だけ変更しようとしてるのが間違いの元っぽいので
sortを1から振り直すように実装すればよさそう。

投稿2018/11/29 08:01

kawax

総合スコア10377

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

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

yuyasato0220

2018/11/30 01:55

やはり前後のソースがないと難しいですよね・・・申し訳ないです ありがとうございます。頂いた内容を参考に考えてみます。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問