WHERE子句后跟OR,然后再返回WHERE

时间:2016-02-25 13:38:23

标签: mysql sql

我将仅发布包含WHERE子句的

//Together
WHERE `energy_extra`.`PacketFk` IN('7')
OR `energy_extra`.`house_extra_id` IN('4')

//Not together (separate where statements)
AND `People_from` <= '4'
AND `People_to` >= '4'
AND `Size` >= '100'
AND `Size` <= '200'
AND `houseconstructiontypelist`.`ConstructionTypeFk` IN('1', '2')

我无法更改这些行的顺序,因为它们是使用条件语句在codeigniter活动记录中编写的更大查询的一部分。我能改变的是SQL本身。

我没有得到所需的结果,因为WHERE foo IN ('7') OR bar IN ('4')后跟AND因此SQL认为这些进一步的条件是OR bar IN()的一部分不是。他们需要以新的WHERE语句开头,之后的每一行都可以从AND开始。

我试过了,但它没有用:

//Together
WHERE `energy_extra`.`PacketFk` IN('7')
OR `energy_extra`.`house_extra_id` IN('4')

//Not together (separate where statements)
WHERE `People_from` <= '4'
AND `People_to` >= '4'
AND `Size` >= '100'
AND `Size` <= '200'
AND `houseconstructiontypelist`.`ConstructionTypeFk` IN('1', '2')

逻辑如下:

find rows where energy_extra.PacketFk is equal to 7 or where energy_extra.house_extra_id is equal to 4

then check all the other conditions 

3 个答案:

答案 0 :(得分:2)

逻辑OR运算符的优先级低于AND运算符 - 因此您获得此结果。

您只需要将第一个条件括在括号中:

WHERE 
(
`energy_extra`.`PacketFk` IN('7')
OR `energy_extra`.`house_extra_id` IN('4')
)
AND .... 

答案 1 :(得分:1)

您还可以将第一个条件(包含或)放在最后,如下所示: -

WHERE `People_from` <= '4'
AND `People_to` >= '4'
AND `Size` >= '100'
AND `Size` <= '200'
AND `houseconstructiontypelist`.`ConstructionTypeFk` IN('1', '2')
And `energy_extra`.`PacketFk` IN('7') OR `energy_extra`.`house_extra_id` IN('4')

或者只是将or语句括在括号中,将其与评论部分中评论的其他语句分开。

答案 2 :(得分:0)

你不能在同一个查询中的位置(codeigniter执行它( - &gt; where()... - &gt; where())但它转换到AND中的其他位置(如果指定的话),I我不确定你需要什么,但解决方案是手工查询并用一些括号来分隔AND,OR。 Codeigniter活跃记录它并不是很好。