让mysql忽略where条件

让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

如果未设置变量,是否有必要使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 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