【发布时间】:2021-02-24 11:52:01
【问题描述】:
SET @last_nid=-1;
SELECT vid,
IF(@last_nid = nid, @last_status, 0) AS last_status,
@last_status := status AS status,
@last_nid := nid AS nid
FROM node_field_revision
ORDER BY vid;
nid 和 vid 均为正整数,status 为 0 或 1。
我完全不知道last_status 怎么会导致NULL - 但它确实如此。
MySQL 手册说:
如果 expr1 为 TRUE(expr1 0 且 expr1 NULL),则 IF() 返回 expr2。否则,它返回 expr3。
好吧,在第一次迭代时@last_nid 不能等于nid,因为一个是负数,另一个是正数。因此,返回 0。是的,@last_status 在这里是 NULL 但不能返回。然后它用status 的值填充@last_status 0 或1。
在进一步的迭代中,@last_status 将永远不会再被设为 NULL。
然而,绝大多数行的@last_status 为NULL——如果我给@last_status 一个初始值,那么这不会发生,但又一次,这意味着我的想法和我的查询是虚假的,但为什么/如何?
【问题讨论】:
-
这实际上是 stackoverflow.com/q/11589439/308851 的副本,MySQL(显然?)以错误的顺序运行计算,强制使用
CASE工作。
标签: mysql mysql-variables