2011-04-21 39 views
1

如果有一個郵件腳本,我已設置爲限制域發送給。剩餘的沒有設置節流率的域將被分配一個默認的比率。發現不匹配現有的節流域的域,我用這個PHP:不喜歡多個OR語句?

$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語句嗎?

回答

14

我會做

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

等。

+1

不錯的方法。從未想過要使用'substring_index',+1! – 2011-04-21 20:08:36

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,在條件之間)

4

你把MySQL的 「人類語言」方法太過分了。 :)每個OR被解釋爲它自己的表達式,而不是作爲對LIKE執行的值。我想你想使用AND。使用OR將始終適用於每行行。

嘗試

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