带有2个OR语句和1个AND语句的SQL查询

时间:2012-08-20 16:29:18

标签: php mysql database

我正在尝试运行这样的SQL查询:

$sql = mysql_query("select * from users where new_mail = 0 OR new_events = 0 and emailed = 1") or die(mysql_error());
while($r=mysql_fetch_array($sql))
{
    mysql_query("update users set emailed = 0 where username='{$r['username']}'") or die(mysql_error());
}

但它似乎忽略了OR语句,只跟在和语句之后。所以它继续进行,并设置通过电子邮件发送到0,即使他们仍然有new_mail或new_event。有什么线索的原因?

感谢您的帮助!

4 个答案:

答案 0 :(得分:7)

在MySQL中,AND运算符比OR运算符高precedence

要获得所需的逻辑,请尝试按照您希望的方式对参数进行分组:

$sql = mysql_query("select * from users where (new_mail = 0 OR new_events = 0) and emailed = 1") or die(mysql_error());

答案 1 :(得分:2)

$sql = mysql_query("select * from users where (new_mail = 0 OR new_events = 0) and emailed = 1") or die(mysql_error());
while($r=mysql_fetch_array($sql))
{
    mysql_query("update users set emailed = 0 where username='{$r['username']}'") or die(mysql_error());
}

您可能需要在where子句

中添加括号

答案 2 :(得分:2)

在OR子句周围加上括号,将其从AND子句中分割出来。

答案 3 :(得分:2)

根据MYSQL操作顺序,AND子句中的WHERE语句在OR语句之前进行评估,除非进行分组。我假设您要执行的操作是,如果new_mail或new_events为0且电子邮件设置为0,则查询返回true。

如果是这样,你需要像这样对OR语句进行分组:

"SELECT * FROM users WHERE (new_mail = 0 OR new_events = 0) AND emailed = 1"

如果您在该循环中没有执行任何其他操作,您也可以将此简化为一个查询,方法是将WHERE子句直接应用于UPDATE查询。

$sql = "UPDATE users SET emailed = 0 WHERE (new_mail = 0 OR new_events = 0) AND emailed = 1"
mysql_query($sql) or die(mysql_error())