2

我正在尝试运行这样的 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 语句,只遵循 and 语句。所以它会继续并将 emailed 设置为 0,即使他们仍然有 new_mail 或 new_event。任何线索为什么?

谢谢你的帮助!

4

4 回答 4

7

在 MySQL 中,AND运算符的优先级高于OR运算符。

要获得您想要的逻辑,请尝试以您希望评估它们的方式对参数进行分组:

$sql = mysql_query("select * from users where (new_mail = 0 OR new_events = 0) and emailed = 1") or die(mysql_error());
于 2012-08-20T16:33:10.237 回答
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 子句中添加括号

于 2012-08-20T16:34:16.267 回答
2

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

于 2012-08-20T16:35:40.817 回答
2

根据 MYSQL 的操作顺序,子句中AND的语句在语句之前评估,除非分组。我假设如果 new_mail 或 new_events 为 0 并且 emailed 设置为 0,您想要做的是让查询返回 true。WHEREOR

如果是这样,您需要像这样对 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())
于 2012-08-20T16:39:32.153 回答