【发布时间】:2008-12-04 20:07:52
【问题描述】:
我正在重置具有重复或缺失值的排序列,如下所示:
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:=...) 将始终为假,此后当任何关键字段更改时,它将为假 从上一行。 (注意,没有一个被连接的关键字段是 NULL)。 当它为假时,我们从 0 (@sort:=0) 重新开始排序计数器,否则,它是 递增 (@sort:=@sort+1) 并使用新值。
在更新语句中设置 @sort 之前,绝不会使用它,所以无论是 在更新语句之前如何设置应该没有区别。
【问题讨论】:
-
我知道这是一个老问题,但是“作为一般规则,您永远不应该为用户变量赋值并在同一语句中读取值。”来自User-defined variables 文档的段落涵盖了它吗?换句话说,MySQL 可能会选择做一些完全出乎意料的事情……
-
我不知道;它继续展示了违反该一般规则的案例,并解释了您如何期望它们起作用,而我的案例不是其中之一。不过,感谢您的链接。
标签: sql mysql user-variables