2

フィールドを持つテーブルがありますsort_id。このフィールドには、データ セットの順序を定義する 1 から n までの数字があります。今、いくつかの要素を削除したいのですが、その後、テーブルを並べ替えたいと思っています。sort_idしたがって、ギャップを「見つけ」、変更に従ってフィールドを変更するクエリが必要です。

確かに、私はこのようなことをすることができます:

SELECT sort_id FROM table WHERE id = 5

次に、sort_id を保存し、その後:

DELETE FROM table WHERE id = 5
UPDATE table SET sort_id = sort_id - 1 WHERE sort_id > {id from above}

しかし、並べ替えプロセスを 1 つのステップで実行したいと思います。

4

3 に答える 3

3

SELECTMladen と Arvo には良いアイデアがありますが、残念ながら MySQL では、同じステートメントでUPDATE同じテーブルを使用することはできません(サブクエリであっても)。これは、MySQL の既知の制限です。

MySQL ユーザー変数を使用するソリューションを次に示します。

SET @i := 0;
UPDATE mytable
SET sort_id = (@i := @i + 1)
ORDER BY sort_id;

それだけの価値があるので、とにかくこれをする気にはなりません。がソートのみに使用され、一種の「行番号」として使用されていない場合sort_id、行を削除した後も行はソートされた順序のままですid=6。値は、並べ替えのために必ずしも連続している必要はありません。

于 2008-11-14T18:29:59.647 に答える
0

MySQLの構文のバリエーションがわからず、クエリをライブでテストすることはできませんが、次のようなもので少なくともアイデアが得られるはずです。

update table t1
set sort_id = (select count * from table t2 where t2.sort_id <= t1.sort_id)
于 2008-11-14T17:50:04.813 に答える
0

SQL Server 2005 の場合: 新しいシーケンスを取得する方法は次のとおりです。

SELECT row_number() over(order by sort_id) as RN
FROM table

テーブルを更新するということは、その選択を更新に参加させる必要があることを意味します。

update t1
set sort_id = t2.RN
FROM table t1 
     join (SELECT row_number() over(order by sort_id) as RN FROM table) t2 
        on t1.UniqueId = t2.UniqueId
于 2008-11-14T16:25:17.823 に答える