让mysql忽略where条件
如果未设置变量,是否有必要使mysql忽略条件,例如让mysql忽略where条件,mysql,Mysql,如果未设置变量,是否有必要使mysql忽略条件,例如 SELECT * FROM foo WHERE id = $id AND bar = $baz 如果$baz被设置为正常运行查询,那么是否运行查询减去AND子句 谢谢 我不知道MySQL是否曾在其执行计划中使用过,但将更便宜的比较放在首位可能是有益的,比如: SELECT * FROM foo WHERE id = $id AND ( $baz [equals null, empty string, zero, whatever] OR b
SELECT *
FROM foo
WHERE id = $id
AND bar = $baz
如果$baz被设置为正常运行查询,那么是否运行查询减去AND子句
谢谢
我不知道MySQL是否曾在其执行计划中使用过,但将更便宜的比较放在首位可能是有益的,比如:
SELECT *
FROM foo
WHERE id = $id
AND ( $baz [equals null, empty string, zero, whatever] OR bar = $baz )
您可以将此方法与多个参数一起使用
SELECT *
FROM foo
WHERE id = $id
AND ( $baz [equals null, empty string, zero, whatever] OR bar = $baz )
AND ( $x = 0 or x = $x )
AND ( $y IS NULL OR y = $y )
-- etc.
只需创建一个变量$ignoreWhere并将其写成: 从foo中选择*其中$ignoreWhere=1或id=$id
将其设置为1以忽略语句的其余部分。是。您添加的条件实际上是变量的条件,如下所示:
SELECT *
FROM foo
WHERE $baz is not null -- this condition tests if $baz is set
AND (
... -- all "normal" conditions, including any involving $baz
)
如果未设置$baz
,则会绕过所有其他条件
$q = "SELECT ... id=$id "
if ($baz)
$q .= " AND bar = $baz";
我假设这些是PHP变量?多亏了Tim Medora。你的解决方案奏效了。 起初我不清楚,但当我使用它时,它起了作用。 这就是故事 如果您使用以下命令,则其行为类似于在$y为Null时跳过AND部分
AND ( $y IS NULL OR y = $y )
如果$y为空,则表示为空
AND( TRUE or y=$y)
也就是说
AND TRUE
这意味着AND部分对WHERE子句的其余部分没有影响。换句话说,它被跳过了。这就是我一开始理解这个问题的方式,但我想他想拥有和禁止。。。忽略,非id=@SergeiTulentsev
$baz
不可能为null
。如果为null
,则OP的条件和bar=$baz
将不为真(null
被认为不等于null
是SQL)。如果他想测试null
,他需要语法和bar IS null
,这需要一个不同的查询。
AND TRUE