2017-04-13 119 views
1

我有一个很大的问题,理解为什么查询在查询中使用LIKE时工作,而在使用NOT LIKE时不工作。不喜欢mysql查询

,我将发布以下查询:

select DISTINCT (mails), name 
from disposable 
    JOIN (
      SELECT DISTINCT (mail) as mails, 
        CONCAT(toys.firstname, ' ' , toys.lastname) as name 
      FROM toys2 
       join toys ON toys.userid = toys2.id 
      where ((toyid = '27' or toyid = '29') 
        and status != 'Sold' 
        and toys.regdate >= '2017-01-01' 
       ) 
     ) as tab 
WHERE tab.mails LIKE CONCAT('%@', disposable.email) 
+2

你是什么意思与“不工作”...?它没有返回任何东西,或者没有返回你期望的东西? – Twinfriends

+0

正在返回结果,好像比较没有发生 – user7861842

+0

上面那个查询中没有'NOT LIKE' –

回答

0

我想你想要的是更多的东西像下面这样。请注意,我简化了架构,以便为SQL Fiddle减少一点工作量。

SELECT c.email, c.name 
    FROM customer c LEFT JOIN disposable d 
    ON SUBSTR(c.email, INSTR(c.email, '@')+1, LENGTH(c.email)-INSTR(c.email, '@')) = d.email 
WHERE d.email IS NULL; 

基本上,在这里你得到了客户的域名,并匹配在disposable表中的条目。最后的WHERE条款使用IS NULL来确定不是一次性的客户电子邮件地址 - 使用IS NOT NULL来查找那些是一次性的。

希望这会有所帮助。

+0

很好的帮助!如果我可以,还有一个帮助请求。 我从子串获得的一些域名就像“1.a.'d.email'”。我如何排除这些? d.email之前的通配符似乎不起作用 – user7861842

+0

对不起,我不明白你的问题。 –

+0

您给我的查询做了以下操作: 将字符串切割为“@”字符和@包括。我得到例如从[email protected] => gmail.com这很棒。 在一次性桌子上,我得到了例如坏域名=> 10go.com 现在有些域名是[email protected],查询无法捕获,因为它将字符串按原样进行比较。我如何绕过? 我试过而不是“.... = d.email” - >“... = CONCAT('%',d.email),但它没有按预期工作 – user7861842