MySQLでの保守/更新するレコード順
-
20-08-2019 - |
質問
私は、MySQLのレコードのテーブルを持っています。私は、ユーザーによって指定されたそれらのための秩序を維持する必要があります。だから私は、「位置」列を追加しました。
私は特定のレコードを移動すると、どのようなSQL文は、すべてのレコードを更新するだろうか?私のようなものを持ってます:
UPDATE items SET position = '2' WHERE id ='4';
UPDATE items SET position = position+1 WHERE position >= '2' AND id != '4';
しかし、より大きなレコードが下に移動した場合よりも少なくなるだろう。トリックは何ですか?ありがとう!
解決
などのためにこの種のものを行いますユーザーによって維持され、行番号と受注は、私はそれが最高のBLやUIの配列でそれを処理することが分かってきました。通常、彼らはいくつかのレコードを調整したいと思うでしょう、そして時には「それを忘れて」と言いたいです。だから、最も簡単にはちょうど彼らが「OK」ボタンを押して(または同等)まで待ち、その後、現在の順序でそれらすべてを書き戻すかもしれません。
あなたは同じように扱うことができる別の問題である、あまりにも、削除を扱って終わる可能性があります。
他のヒント
このようなものは、それを行うだろうか?
UPDATE items
SET position = CASE position
WHEN $oldpos THEN $newpos
ELSE position + SIGN($oldpos-$newpos)
END
WHERE position BETWEEN LEAST( $newpos, $oldpos )
AND GREATEST( $newpos, $oldpos );
私はそれを数回をテストし、動作しているようです。
これは、この上の私のテイクがある:私のROW_INDEX列は10のステップに番号を持っている(例えば:0、10、20、ECC。)。ユーザーは、それが上下に起こっているのかどうかを知る必要がある行の1を更新します。あなたは(下がって、希望ROW_INDEX = 30)4位に2行目を移動する必要がある場合は、35にROW_INDEXを設定します。そうでない(上がっている場合)25.設定し、この値に設定します:
UPDATE your_table SET row_index = 35 WHERE your_id = 1234
さて、あなたは正しい順序を持っていますが、row_indexesが台無しにされています。この問題を修正するには、この2つのクエリを実行します:
SET @pos:=-10;
UPDATE your_table SET row_index = @pos:=@pos+10 WHERE ...
これは、すべての行(またはあなたがどこ文で選択1)を更新しようと隙間なくROW_INDEX列を設定されている(0、10、20、30、ECC。)。確かにこの方法は、書き込み操作の負荷が追加されますが、私はそれが読み出し動作中に順序を取得するための最速の方法だと思います。あなたが行を削除する場合は、あなただけの固定順序クエリを再実行することができます。
私は、項目間の大きな増分を(10000を言う)を使用して、最低でも、お勧めします。それからちょうどで順番をやって。あなたは9000と10000の間に11000を移動する必要がある場合は、ちょうど9500に設定して行われます。
これは、並べ替えの問題がなくなるわけではありませんが、それは非常にそれを軽減します。いくつかの時点で、正しい順序でそれらをreaddingその後、すべての行を削除する方がいいでしょう。あなたがやっているように更新を行うことはあまりにもエラーが発生しやすく私見です。
あなたは次の鍵、リスト内の多分前の項目で、アプローチのリンクリストのタイプを使用して検討するかもしれない、あなたはわずか数、レコード、代わりにそれらのすべてを更新する必要があります。
興味深いです!わかりましたので、簡単な答えはありません。私はちょうど何かが欠けていたと思いました。私は外部の配列を維持することを考えたのです。それは最高のアイデアのように聞こえます。
たぶん、このような何か?
$item_id = $_GET['item_id'];
$position = $_GET['new_position'];
$old_position = $_GET['old_position'];
if($new_position < $old_position) {
SQL: UPDATE items SET position = position+1 WHERE position >= $new_position AND position < $old_position
} else {
SQL: UPDATE items SET position = position-1 WHERE position <= $new_position AND position > $old_position
}
SQL: UPDATE items SET position = $new_position WHERE item_id = $item_id