1

単一のアイテムの位置を更新するときに、リストからアイテムの位置を更新しようとしています。例:

  1. item1
  2. item2
  3. item3
  4. item4
  5. item5

item5を位置2に移動すると、リストが次のように更新されます。

  1. item1
  2. item5<<新しい位置
  3. item2<<[ 1つ下に移動]
  4. item3<<[ 1つ下に移動]
  5. item4<<[ 1つ下に移動]

UPDATE subjects SET  
position = (CASE WHEN position < {$position} THEN position + 1
WHEN position > {$position} THEN position - 1 else position END CASE)
WHERE position <= position AND position >= {$position};

このSQLクエリは機能しません。ただし、IF position <{$ position}の場合は、現在のWHERE句を使用しますが、position> {$ position}の場合は、<=と>=を入れ替えます。 (これにより、リストの位置を上下に移動するときに更新できるようになります

4

2 に答える 2

2

常に同じ行で等しいWHERE position <= positionので、の要件が何であるかわかりません...positionposition

また、更新ステートメントが 1 つのパラメーターだけでどのように機能するかわかりません。更新するアイテムの現在の位置と、移動する位置が必要ですか?

上記が正しいと仮定すると、クエリを次のように記述できます ($new新しい位置と$current現在の位置に 2 つのパラメーターを使用)。

UPDATE  subjects
SET     position = CASE WHEN position = {$current} THEN {$new} 
                        ELSE position + SIGN({$current} - {$new}) 
                    END
WHERE   position BETWEEN LEAST({$current}, {$new}) AND GREATEST({$current}, {$new})

前提として、現在の値と新しい値の間の行のみを更新する必要があり、これは where 句でカバーされています。次に、update ステートメントはSIGN関数を使用して、移動がシフト アップかシフト ダウンかを確認し、現在の位置に 1 を追加または削除します (新しい位置で更新される移動する行を除く)。

実施例

http://sqlfiddle.com/#!2/99c64/1

スキーマ セクションで更新を行う必要があったため、SQL Fiddle でテーブルがどのように変更されたかを正確に確認することはできませんが、結果から、値「3」の行が位置 8 に移動したことがわかります。位置 3、および 8 から 4 までのすべての位置が 1 つ下にシフトされています。次のフィドルでは、プロセスが逆になります (行 8 が 3 に移動され、3 から 7 が 1 つ上にシフトされます)。

http://sqlfiddle.com/#!2/a087b/1

于 2012-06-12T15:15:09.463 に答える
0

position制約がある場合、MySQL のステートメントが機能UNIQUEする非標準的な方法のため、2 つまたは 3 つの手順が必要です。UPDATE

UPDATE subjects 
  SET position = -67             --- an impossible value
WHERE position = 5 ;

UPDATE subjects 
  SET position = position + 1     
WHERE position BETWEEN 2 AND 5 
ORDER BY position DESC ;   

UPDATE subjects 
  SET position = 2
WHERE position = -67 ;   
于 2012-06-12T14:39:01.523 に答える