0
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;

nidandvid都是正整数,并且status是 0 或 1。

我完全不知道如何last_status导致NULL- 但它确实如此。

MySQL手册说:

如果 expr1 为 TRUE(expr1 <> 0 且 expr1 <> NULL),则 IF() 返回 expr2。否则,它返回 expr3。

好吧,第一次迭代@last_nid不能等于,nid因为一个是负的,另一个是正的。因此,返回 0。是的,@last_status这里是 NULL 但不能返回。然后它填充为 0 或 1@last_status的值。status

在进一步的迭代中,@last_status永远不会再被设为 NULL。

然而,绝大多数行都有 NULL 作为它的@last_status- 如果我给出@last_status一个初始值,那么这不会发生,但又一次,这意味着我的想法和我的查询是虚假的,但为什么/如何?

4

1 回答 1

0

您没有初始化@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;
于 2020-11-12T13:19:17.333 回答