2014-03-27 76 views
1

我運行此查詢MySQL查詢返回不正確的結果與多個般的表情

SELECT `contacts`.* 
FROM `contacts` 
WHERE 
    ((email NOT LIKE '%domain1%') AND 
    (email NOT LIKE '%domain2%') AND 
    (email NOT LIKE '%domain3%') AND 
    (email NOT LIKE '%domain4%') 
    ) AND (
    DATE(created_at) = '2014-03-21' 
    ) 

結果是

=> [["[email protected]", Fri, 21 Mar 2014 06:17:07 UTC +00:00], 
    ["[email protected]", Fri, 21 Mar 2014 17:05:21 UTC +00:00]] 

問題

  • 結果應該排除與「域1」的所有行,「domain2」等等......但它並沒有這樣做

PS:查詢結果沒有顯示爲MySQL輸出,因爲我從rails控制檯運行它。

Contact.external.created_on(Time.parse("2014-03-21 ")).collect {|e| [e.email, e.created_at]} 
+1

你肯定是查詢正在運行?它應該做你期望的並且過濾掉這四個域。 –

+0

只是建議,我建議在您的域名中包含TLD,例如「domain1.com」。然後你可以使用'SUBSTRING(email ...)'而不是'LIKE'。我認爲這可以提高表現。 –

+0

如果您需要檢查它,您可以從您的mysql.log文件中提取實際查詢 – andrew

回答

1

OR條件,而不是

SELECT `contacts`.* 
FROM `contacts` 
WHERE 
    (email NOT LIKE '%domain1%' OR 
    email NOT LIKE '%domain2%' OR 
    email NOT LIKE '%domain3%' OR 
    email NOT LIKE '%domain4%' 
    ) AND (
    DATE(created_at) = '2014-03-21' 
    ) 

"[email protected]"儘量不,NOT LIKE '%domain4%'如果是有道理的

+1

或者無論如何要選擇每一行。我對嗎? '真或假'將選擇每一行。 – ramonrails

+0

@ramonrails。 。 。你是對的。如果它像其中一種模式,那麼它就不像其他模式,所以'或'將總是評估爲真。 –