ソート スクリプトから値を返します。このスクリプトは、変更の開始時と終了時の要素の位置を提供します。では、4 位が 1 位になったとしましょう。順序を維持するには、元の 1 番目、2 番目、3 番目の位置に 1 を追加するだけでよいことを知っています。
では、データベースを更新する最良の方法は何ですか? 変更が必要なすべての ID に対してループでクエリを実行することですか? これは 4 つの更新クエリですが、これは非効率的ですか? 別の方法はありますか?
ソート スクリプトから値を返します。このスクリプトは、変更の開始時と終了時の要素の位置を提供します。では、4 位が 1 位になったとしましょう。順序を維持するには、元の 1 番目、2 番目、3 番目の位置に 1 を追加するだけでよいことを知っています。
では、データベースを更新する最良の方法は何ですか? 変更が必要なすべての ID に対してループでクエリを実行することですか? これは 4 つの更新クエリですが、これは非効率的ですか? 別の方法はありますか?
位置を上下に移動しているかどうかに関係なく、単一のクエリでテーブル内の行の位置の値を更新できます。
UPDATE tbl
SET pos = CASE WHEN pos = [oldpos] THEN
[newpos]
WHEN [newpos] < [oldpos] AND pos < [oldpos] THEN
pos + 1
WHEN [newpos] > [oldpos] AND pos > [oldpos] THEN
pos - 1
END
WHERE pos BETWEEN LEAST([newpos], [oldpos]) AND GREATEST([newpos], [oldpos])
pos
あなたの位置フィールドです。
[oldpos]
行の現在の位置とその行の新しい位置を渡すだけで[newpos]
、クエリが機能します。
元。行を 3 位から 10 位に変更する場合:
UPDATE tbl
SET pos = CASE WHEN pos = 3 THEN
10
WHEN 10 < 3 AND pos < 3 THEN
pos + 1
WHEN 10 > 3 AND pos > 3 THEN
pos - 1
END
WHERE pos BETWEEN LEAST(3, 10) AND GREATEST(3, 10)
私はあなたがやろうとしていると思うことに似たことをしました。各行がグリッド内のページに配置される特定の UI 要素を表すテーブルがありました。ユーザーは UI 要素の順序を変更できたので、その番号をテーブルに保存して、デフォルトでその順序で表示されるようにしました。
このために、私の記憶が正しければ、次の 2 つのクエリを使用しました。
UPDATE table SET position = 0 WHERE position = 4;
UPDATE table SET position = position+1 WHERE position < 4;
最初のクエリはその特定の行を最小の数に設定し、2 番目のクエリは元の値の下にあるすべての行を 1 増やします (0 に設定した行を含めて 1 にします)。
リレーショナル データベースでは、基になるテーブルに固有の順序はありません。したがって、出力の順序を変更したいと思います。次のクエリをお勧めします。
select t.*
from t join
newsort
on t.id = newsort.id
order by newsort.newid