我正在重置具有重复或缺失值的排序列,如下所示:
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)。当它为假时,我们从 0 (@sort:=0) 重新开始排序计数器,否则,它会递增 (@sort:=@sort+1) 并使用新值。
在更新语句中设置之前,绝不会使用@sort,因此在更新语句之前是否设置或如何设置应该没有区别。