Mysql PHP高级条件

时间:2013-05-06 15:55:19

标签: php mysql conditional-statements

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

2 个答案:

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

我会给条件编号:

  1. tbl_name LIKE $table_choice
  2. ((i1<=i2 AND i2<=d1) OR (i1<=d2 AND d2 <=d1))
  3. (i2<=i1 AND d2<=d1)
  4. 如果发生以下任何情况,将包含一行:

    • 1 2 3 为真
    • 1 2 为真
    • 1 3 为真

    基本上, 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
    

    我会再次对这些条件进行编号:

    1. tbl_name LIKE $table_choice
    2. (i1<=i2 AND i2<=d1)
    3. (i1<=d2 AND d2<=d1)
    4. (i2<=i1 AND d2<=d1)
    5. 如果发生以下情况,上面的WHERE子句将包含一行:

      • 1和2都是真的
      • 1和3都是真的
      • 1和4是真的

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