我想知道带括号的以下查询是否真的有效。我有三个条件用OR
分隔,所以我想知道它是否真的只需要三个条件中的一个或多个条件:
SELECT * FROM `table_ref` WHERE `tbl_name` LIKE `$table_choice` AND ( ( i1<=i2 AND i2<=d1 ) OR ( i1<=d2 AND d2 <=d1 ) OR ( i2<=i1 AND d2<=d1 ) )
答案 0 :(得分:2)
这是你的缩进查询,这使得(至少对我来说)更容易遵循逻辑:
SELECT * FROM `table_ref`
WHERE `tbl_name` LIKE `$table_choice` AND
(
((i1<=i2 AND i2<=d1) OR (i1<=d2 AND d2 <=d1)) OR
(i2<=i1 AND d2<=d1)
)
我会给条件编号:
tbl_name LIKE $table_choice
((i1<=i2 AND i2<=d1) OR (i1<=d2 AND d2 <=d1))
(i2<=i1 AND d2<=d1)
如果发生以下任何情况,将包含一行:
基本上, 1 总是必须为真,然后 2 和 3 中的任何一个(或两者)都必须为真。
此外,如果您使用mysql
PHP函数,您的代码将容易受到SQL注入攻击。请改用PDO或mysqli。更多信息here和其他一些地方。
附录:后续评论表明OP想要“异或”条件:
我所指的三个条件是:1(i1&lt; = i2 AND i2&lt; = d1),2(i1&lt; = d2 AND d2&lt; = d1),3(i2&lt; = i1 AND d2&lt; = d1) ,如果其中一个是真的,我只想要包含一行
MySQL有一个XOR
运算符,但XOR
仅适用于两个条件。处理两个以上时,它会很快变得复杂。我建议这样的事情(仍然包括tbl_name
条件):
WHERE tbl_name LIKE '$table_choice'
AND 1 =
CASE WHEN i1<=i2 AND i2<=d1 THEN 1 ELSE 0 END +
CASE WHEN i1<=d2 AND d2<=d1 THEN 1 ELSE 0 END +
CASE WHEN i2<=i1 AND d2<=d1 THEN 1 ELSE 0 END
我会再次对这些条件进行编号:
tbl_name LIKE $table_choice
(i1<=i2 AND i2<=d1)
(i1<=d2 AND d2<=d1)
(i2<=i1 AND d2<=d1)
如果发生以下情况,上面的WHERE
子句将包含一行:
答案 1 :(得分:0)
您的查询与使用相同:
SELECT * FROM `table_ref` WHERE `tbl_name` LIKE `$table_choice` AND ((i1<=i2 AND i2<=d1) OR (i1<=d2 AND d2<=d1) OR (i2<=i1 AND d2<=d1))