次のように、値が重複または欠落しているソート列をリセットしています。
set @last='';
set @sort=NULL;
update conf_profile set sort=
if(
@last=(@last:=concat(org_id,',',profile_type_id,',',page,',',col)),
(@sort:=@sort+1),
(@sort:=0)
)
order by org_id,profile_type_id,page,col,sort,id;
(順次増加する値をソートに割り当てるいくつかのキー フィールドによってソートされたすべての行を調べます。これらのフィールドのいずれかが変更されるたびに、0 から再開します。)
更新を行う前に @sort 変数が作成された場合にのみ機能するようです (ただし、設定されているものは関係ありません)。「set @sort」を指定しないと、すべてのソート値が 0 または NULL に設定されます。
なぜこれがそうなるのですか?MySQL バージョン 5.0.51。
更新: ロジックを詳しく説明するには: 最初の行では、@last=(@last:=...) は常に false になり、その後、キー フィールドのいずれかが前の行から変更されると false になります。 . (注意: 連結されるキー フィールドはいずれも NULL ではありません)。false の場合は、並べ替えカウンターを 0 から再度開始し (@sort:=0)、それ以外の場合はインクリメントされ (@sort:=@sort+1)、新しい値が使用されます。
update ステートメントで設定される前に @sort が使用されることは決してありません。