我想知道以下带括号的查询是否真的有效。我有三个用 分隔的条件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 ) )
我想知道以下带括号的查询是否真的有效。我有三个用 分隔的条件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 ) )
这是您的缩进查询,这使得(至少对我而言)更容易遵循逻辑:
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。更多信息在这里和其他一些地方。
附录:后续评论表明 OP 想要一个“异或”条件:
不,我的意思是三个条件: 1 (i1<=i2 AND i2<=d1) , 2 (i1<=d2 AND d2 <=d1), 3 (i2<=i1 AND d2<=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
子句将包含一行:
您的查询与使用相同:
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))