PHP初学者です。
PHPとMySQLで商品管理の仕組みを構築しようとしています。
商品登録とリスト表示は出来たのですが、
並べ替えをどう実装するのかわからず、
質問いたします。
並べ替え方法はネットで調べたところ
「前の順番のIDと次の順番のIDを持ち、それらを入れ替える」
という方法があると知りました。
###【並べ替えの考え方】
以下の様なテーブルを用意します
※例のため単純化しています。
[テーブル名:menutable] [カラム名:id,title,prev,next] [並び順:1,2,3,4,5,6,7,8,9,10] 1,apple,0,2 2,orange,1,3 3,grape,2,4 4,strawberry,3,5 5,banana,4,6 6,cherry,5,7 7,peach,6,8 8,pine,7,9 9,melon,8,10 10,raspberry,9,11
8のpineを2番目に移動させるために行う書き換えは、
以下のとおりです。
[並び順:1,8,2,3,4,5,6,7,9,10] 1,apple,0,8 2,orange,8,3 3,grape,2,4 4,strawberry,3,5 5,banana,4,6 6,cherry,5,7 7,peach,6,9 8,pine,1,3 9,melon,7,10 10,raspberry,9,11
この方法だと、自分のprevとnext、
割りこむ先の両隣(1,2)と、元の両隣(7,9)のprevとnextのみの
変更で済むので、レコード数が増えた時に非常に効率的というものです。
以下のようなフォームでデータを投げることを想定しています。
※これも単純化しています
<form action="./" method="post"> <p>移動元:<input type="text" name="from" value="8" /></p> <p>移動先:<input type="text" name="to" value="2" /></p> <input type="submit" value="メニュー更新"> </form>
###【質問1】
並べ替えの処理は以下のようにしようとしています。
この考え方はあっていますでしょうか。
- fromをもとにid=8を持つレコードを取得[idが8のレコード]
- toをもとにid=2を持つレコードを取得[idが2のレコード]
- fromをもとにprev=8を持つレコードを取得[idが7のレコード]
- fromをもとにnext=8を持つレコードを取得[idが9のレコード]
- toをもとにprev=2を持つレコードを取得[idが1のレコード]
- id=8のprevとnextをid=2のprevとnextに書き換え
- id=7のnextとid=9のprevをtoの2に書き換え
- id=1のnextとid=2のprevをfromの8に書き換え
###【質問2】
並べ方の考え方は以下のように思うのですが、
組み方がわからず、お教えいただけませんでしょうか。
0. prevに0を持っているレコードを取得[idが1のレコード]
0. 取得したレコードのnextをもとに次のレコードを取得[idが8のレコード]
0. 以後2を繰り返し
###【質問3】
この方法は「書き換えが途中で止まって順番がおかしくなる」
という問題への対策が必要、ともありました。
これは「変更前に変更予定の値を別途保存しておいて、
変更後の値に重複があったときは、エラーとして
変更前の値に戻す」というものを想像しているのですが、
これも実現の方法がわかりません。。。
上記3点、お手数をおかけいたしますが
ご教授いただけませんでしょうか。
お手数をおかけいたしますが、
よろしくお願いいたします。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/01/24 07:00
2016/01/24 08:03
2016/01/24 08:39 編集
2016/01/24 11:15