gpt4 book ai didi

mysql - 通过列描述中更改的变量值过滤选择的行

转载 作者:可可西里 更新时间:2023-11-01 08:51:15 29 4
gpt4 key购买 nike

任何人都可以解释以下两个请求之间的区别:

SET @foundnow=0;
SELECT id, (@foundnow:=IF(`id`=3,1,0)) as ff
FROM `sometable`
HAVING @foundnow=0
result is
id ff
1 0
2 0
3 1

SET @foundnow=0;
SELECT id, (@foundnow:=IF(`id`=3,1,0)) as ff
FROM `sometable`
HAVING ff=0
result is
id ff
1 0
2 0
4 0
5 0
...

为什么首先给出 id=3(包括)之前的所有行,其次给出 id=3 除外的所有行?

我想与这个问题相关的是以下请求的“意外”行为

SET @tot=0;
SELECT @tot:=@tot+1 as `ff`
FROM `anytable`
HAVING (`ff`>10)

给出 ff=12,14,16,18... 的行

最佳答案

@foundnow 不是每行变量。它继续存在。创建列 ff 使其成为每行值。另外,来自 the documentation :

In a SELECT statement, each select expression is evaluated only when sent to the client. This means that in a HAVING, GROUP BY, or ORDER BY clause, referring to a variable that is `assigned a value in the select expression list does not work as expected:

这意味着您的第一个示例如下:

  • 1:需要@foundrow,为0,所以发送,设置@foundrow为新值(0)
  • 2:需要@foundrow,为0,所以发送,设置@foundrow为新值(0)
  • 3:需要@foundrow,为0,所以发送,设置@foundrow为新值(1)
  • 3:有需要@foundrow,为1,不发送
  • 4:有需要@foundrow,为1,不发送
  • 5:有需要@foundrow,为1,不发送
  • 等...

你的第二个是这样的:

  • 1:有需求ff,执行select,set @foundrow,set ff (=no longer @foundrow) = send
  • 2:有需求ff,执行select,set @foundrow,set ff (=no longer @foundrow) = send
  • 3:有需求ff,执行select,设置@foundrow,设置ff(=不再@foundrow)=不发送
  • 4:有需求ff,执行select,set @foundrow,set ff (=no longer @foundrow) = send

因此,如果@foundrow!=0,第一个示例根本不 不计算表达式,因为@foundrow 是已知的,MySQL 不关心该选择表达式中的内容。第二个引用结果集中的列,因此必须知道该结果并执行选择。

此外,如果可以使用 WHERE,请尽可能避免使用 HAVING 子句,它们非常更受欢迎。

关于mysql - 通过列描述中更改的变量值过滤选择的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13826842/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com