如果没有设置变量,是否会使mysql忽略条件,例如
SELECT *
FROM foo
WHERE id = $id
AND bar = $baz
如果设置了$ baz,则运行查询正常,否则运行查询减去AND子句?
由于
答案 0 :(得分:6)
SELECT *
FROM foo
WHERE id = $id
AND ( bar = $baz OR $baz [equals null, empty string, zero, whatever] )
我不知道MySQL是否曾在其执行计划中使用short circuit evaluation,但将更便宜的比较放在首位可能是有益的,例如:
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.
答案 1 :(得分:2)
$q = "SELECT ... id=$id "
if ($baz)
$q .= " AND bar = $baz";
我认为这些是PHP变量?
答案 2 :(得分:1)
只需创建一个变量$ ignoreWhere并将其写为:
SELECT * FROM foo WHERE $ ignoreWhere = 1 OR id = $ id
将其设置为1以忽略语句的其余部分。
答案 3 :(得分:0)
是。您添加一个实际上是变量条件的条件,如下所示:
SELECT *
FROM foo
WHERE $baz is not null -- this condition tests if $baz is set
AND (
... -- all "normal" conditions, including any involving $baz
)
如果未设置$baz
,则绕过所有其他条件
答案 4 :(得分:0)
感谢Tim Medora。您的解决方案有效 起初我不清楚,但是当我使用它时起作用。 所以这是故事 如果您使用以下内容,则当$ y为空时,它就像滑动AND部分一样。
AND ( $y IS NULL OR y = $y )
如果$ y为null,则表示它是
AND( TRUE or y=$y)
表示
AND TRUE
所以这意味着AND部分对WHERE子句的其余部分没有影响。换句话说,它被跳过了。