1

シンプルな 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 つずつ保存することもできますが、それではうまくいかないと思います。

4

2 に答える 2

1

次の関数でトリガーを使用してみませんか。

「行が削除されたら、削除された行よりも大きいeverewriter_idを1つ減らします」

または擬似コードで言うと:

create trigger for delete...
    update book 
    set writer_id = writer_id - 1 
    where writer_id > deleted.writer_id 
于 2012-10-02T06:10:26.827 に答える
0

MySQLのドキュメントを引用させてください。

原則として、ユーザー変数に値を割り当てたり、同じステートメント内で値を読み取ったりしないでください。期待どおりの結果が得られる場合がありますが、これは保証されていません。ユーザー変数を含む式の評価の順序は未定義であり、特定のステートメントに含まれる要素に基づいて変更される可能性があります。さらに、この順序は、MySQLサーバーのリリース間で同じであるとは限りません。

したがって、あなたが物事を行おうとする方法はうまくいくかもしれませんが、絶対に保証はありません。したがって、MySQLではなくPHPでこれを行うことをお勧めします。または、ストアドプロシージャを使用してMySQLで実行します。

于 2012-10-02T05:31:30.807 に答える