2014-03-27 46 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。 。 。你是对的。如果它像其中一种模式,那么它就不像其他模式,所以'或'将总是评估为真。 –