4

ソート スクリプトから値を返します。このスクリプトは、変更の開始時と終了時の要素の位置を提供します。では、4 位が 1 位になったとしましょう。順序を維持するには、元の 1 番目、2 番目、3 番目の位置に 1 を追加するだけでよいことを知っています。

では、データベースを更新する最良の方法は何ですか? 変更が必要なすべての ID に対してループでクエリを実行することですか? これは 4 つの更新クエリですが、これは非効率的ですか? 別の方法はありますか?

4

3 に答える 3

8

位置を上下に移動しているかどうかに関係なく、単一のクエリでテーブル内の行の位置の値を更新できます。

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)
于 2012-08-28T19:09:24.307 に答える
3

私はあなたがやろうとしていると思うことに似たことをしました。各行がグリッド内のページに配置される特定の UI 要素を表すテーブルがありました。ユーザーは UI 要素の順序を変更できたので、その番号をテーブルに保存して、デフォルトでその順序で表示されるようにしました。

このために、私の記憶が正しければ、次の 2 つのクエリを使用しました。

UPDATE table SET position = 0 WHERE position = 4;
UPDATE table SET position = position+1 WHERE position < 4;

最初のクエリはその特定の行を最小の数に設定し、2 番目のクエリは元の値の下にあるすべての行を 1 増やします (0 に設定した行を含めて 1 にします)。

于 2012-08-28T17:59:05.827 に答える
1

リレーショナル データベースでは、基になるテーブルに固有の順序はありません。したがって、出力の順序を変更したいと思います。次のクエリをお勧めします。

select t.*
from t join
     newsort
     on t.id = newsort.id
order by newsort.newid
于 2012-08-28T17:59:44.643 に答える