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ステートメントのみに従います。そのため、new_mail または new_event がまだ残っている場合でも、emailed を 0 に設定します。理由はありますか?

ご協力いただきありがとうございます!

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

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句をクエリに直接適用することで、これを 1 つのクエリに単純化することもでき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 に答える
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 に答える