2

mySql にレコードのテーブルがあります。ユーザーが指定した順序を維持する必要があります。そこで、「位置」列を追加しました。

特定のレコードを移動するときにすべてのレコードを更新する SQL ステートメントは何ですか? 私は次のようなものを持っています:

UPDATE items SET position = '2' WHERE id ='4';
UPDATE items SET position = position+1 WHERE position >= '2' AND id != '4';

しかし、レコードが下に移動した場合、より大きなものはより小さなものになります。トリックは何ですか?ありがとう!

4

7 に答える 7

2

この種のことを、たとえばユーザーが管理する行番号を持つ販売注文に対して行うと、BL または UI の配列で処理するのが最善であることがわかりました。通常、彼らはいくつかのレコードを調整したいと考えており、「忘れてください」と言いたいこともあります。したがって、最も簡単な方法は、「OK」ボタン (または同等のボタン) が押されるまで待ってから、現在の順序ですべてを書き戻すことです。

削除も処理することになるかもしれませんが、これは同じ方法で処理できる別の問題です。

于 2009-01-26T23:22:26.407 に答える
1

これは私の見解です。私のrow_index列には10刻みの数字があります(例:0、10、20など)。ユーザーが行の 1 つを更新するとき、それが上昇しているか下降しているかを知る必要があります。2 番目の行を 4 番目に移動する必要がある場合 (下に行くと、必要な row_index = 30)、row_index を 35 に設定します。それ以外の場合 (上昇する場合) は 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 ...

これにより、すべての行 (または where ステートメントで選択した行) が更新され、row_index 列がギャップなしで設定されます (0、10、20、30 など)。確かにこの方法では書き込み操作に負荷がかかりますが、読み取り操作中に順序を取得する最速の方法だと思います。行を削除すると、修正順序クエリを再実行できます。

于 2011-01-28T10:29:57.733 に答える
0

たぶん、このようなものですか?

$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 
于 2013-11-25T13:45:35.220 に答える
0

少なくとも、アイテム間で大きな増分 (たとえば 10000) を使用することをお勧めします。次に、注文を行うだけです。11000 を 9000 から 10000 の間に移動する必要がある場合は、9500 に設定して完了します。

これで並べ替えの問題が解消されるわけではありませんが、大幅に軽減されます。ある時点で、すべての行を削除してから、正しい順序で再読み込みする方がよいでしょう。あなたがやっているように更新を行うと、エラーが発生しやすくなります。

于 2009-01-26T23:27:04.850 に答える
0

You might consider using a linked list type of approach, with a key to the next, and maybe the previous item in the list, then you only have to update a few records, instead of all of them.

于 2009-01-26T23:29:56.937 に答える
0

Interesting! Okay, so there is no easy answer. I thought I was just missing something. I'd thought about maintaining an external array. That sounds like the best idea.

于 2009-01-26T23:32:26.383 に答える