シンプルな MySQL クエリを使用して、テーブルを位置で更新しようとしています。ID、writer_id、および position フィールドを持つ book テーブルがあるとします。
1 ... x からの位置を持つことができるようにしたいのですが、writer_id ごとです。レコードを削除すると、位置にギャップが生じるため、簡単なクエリですべての位置をギャップなしでリセットする必要があります。
現在、私は次のコードを持っています(これは機能します)が、これはもっと簡単に(そしておそらく速く)できるはずだと思います。
set @position := 0;
set @lastDependency := 0;
set @previousDependency := -1;
UPDATE `book` SET
`writer_id`=(@lastDependency:=`writer_id`), -- Set writer_id of current row
position=(
IF (
NOT @lastDependency=@previousDependency,
@position:=1, -- New writer_id => set position to 1
@position:=@position+1 -- Same writer id, increment position
)
),
`writer_id`=(@previousDependency:=`writer_id`) -- Set writer_id of last used row
ORDER BY `writer_id`, position ASC -- Order by current positions
PHP を使用して、すべてのレコードをループして 1 つずつ保存することもできますが、それではうまくいかないと思います。