不喜欢多个OR语句?

时间:2011-04-21 20:03:10

标签: php mysql

如果有一个邮件脚本,我设置为限制我发送到的域。如果没有设置节流速率的剩余域,则会为其分配默认速率。要找到与现有限制域不匹配的域,我使用这个php:

$query = "SELECT * FROM `mailer_lists` ml JOIN `mailer_controller` mc";
        $query .= " ON ml.project_name = mc.project_name";
        $query .= " WHERE `email` NOT LIKE '%";
        $query .= "" . implode("' OR '%", $throttle_domain) . "'";
        echo "$query";

回声的输出是:

SELECT * FROM `mailer_lists` ml JOIN `mailer_controller` mc ON ml.project_name = mc.project_name WHERE `email` NOT LIKE '%gmail.com' OR '%hotmail.com' OR '%yahoo.com' OR '%aol.com'

据我所知,输出看起来非常好。我在phpmyadmin中运行了一个测试查询,只有第一个域适用。在OR被忽略之后的任何事情。

这个查询有什么明显错误我错过了吗?使用NOT LIKE语句时,不能使用多个OR语句吗?

3 个答案:

答案 0 :(得分:14)

我愿意

where substring_index(`email`,'@',-1) not in ('yahoo.com','gmail.com')

等等。

答案 1 :(得分:4)

你采用mySQL的“人类语言”方法太过分了。 :)每个OR都被解释为它自己的表达式,而不是作为LIKE反对的值。

另外,我想你想使用AND。使用OR始终适用于每个行。

尝试

    (`email` NOT LIKE "%gmail.com") 
AND (`email` NOT LIKE "%hotmail.com") 
AND (`email` NOT LIKE "%yahoo.com") ....

答案 2 :(得分:3)

您必须重复field_name not like部分:

SELECT * 
FROM `mailer_lists` ml 
    JOIN `mailer_controller` mc ON ml.project_name = mc.project_name 
WHERE 
    `email` NOT LIKE '%gmail.com' 
    and `email` NOT LIKE '%hotmail.com' 
    and `email` NOT LIKE '%yahoo.com' 
    and `email` NOT LIKE '%aol.com' 
LIMIT 50

(您可能必须在条件之间使用and,而不是or