问题描述
your_event.is_set()
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
是0或1。
status
如何导致last_status
的问题上,我完全不知所措,但确实可以。
MySQL手册说:
如果expr1为TRUE(expr1 0和expr1 NULL),则IF()返回expr2。否则,它将返回expr3。
好吧,第一次迭代NULL
不能等于@last_nid
,因为一个是负数,另一个是正数。因此,返回0。是的,nid
在此处为NULL,但无法返回。然后用@last_status
的值@last_status
填充0或1。
在进一步的迭代中,status
将永远不会再为NULL。
但是,绝大多数行的@last_status
都为NULL-如果我给@last_status
赋一个初始值,那么那不会发生,但是再次出现,这意味着我的想法和我的查询是假的,但是为什么/如何?
解决方法
您没有初始化@last_status
变量,因此服务器认为它是NULL常量。
在执行查询之前初始化所有变量,不仅是其中之一,也可以在查询中执行:
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
CROSS JOIN (SELECT @last_nid:=-1,@last_status:=0) AS initialize_variables
ORDER BY vid;