-2

我想知道以下带括号的查询是否真的有效。我有三个用 分隔的条件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 ) )
4

2 回答 2

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)
  )

我将条件编号:

  1. tbl_name LIKE $table_choice
  2. ((i1<=i2 AND i2<=d1) OR (i1<=d2 AND d2 <=d1))
  3. (i2<=i1 AND d2<=d1)

如果发生以下任何情况,将包含一行:

  • 123是真的
  • 12是真的
  • 13是真的

基本上,1必须始终为真,然后23中的任何一个(或两者)都必须为真。


此外,如果您使用mysqlPHP 函数,您的代码将容易受到 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

我将再次对条件进行编号:

  1. tbl_name LIKE $table_choice
  2. (i1<=i2 AND i2<=d1)
  3. (i1<=d2 AND d2<=d1)
  4. (i2<=i1 AND d2<=d1)

如果发生以下情况,上述WHERE子句将包含一行:

  • 1和2是真的
  • 1和3是真的
  • 1和4是真的
于 2013-05-06T16:08:30.277 回答
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))
于 2013-05-06T15:57:58.470 回答