2017-07-07 29 views
0

我有一个表称为whitelist_email它看起来像这样如何找到一个表中的条目不喜欢那些在其他

+----+---------------------+-------------+ 
| id | email_suffix  | create_date | 
+----+---------------------+-------------+ 
| 1 | stackoverflow.com | 2017-07-07 | 
| 2 | example.com   | 2017-07-07 | 

和一张桌子称为user_info与现场叫verified_email。我想编写一个命令查找user_info中的所有行,其verified_email字段不会以whitelist_email中的任何条目结束,以给我一个需要审查的新用户列表。我可以用我有限的知识,做的最好的是

SELECT verified_email 
FROM user_info 
WHERE verified_email IN (
    SELECT email_suffix 
    FROM whitelist_email 
); 
+0

'select verified_email from user_info where right(verified_email,length(verified_email)-INSTR(verified_email,'@'))not in(从whitelist_email选择email_suffix);' – Ashraf

回答

1

一种方法是LEFT JOINuser_info表上的经过验证的电子邮件地址列入白名单的后缀结束的条件whitelist_email表,然后只保留其中没有电子邮件不是与任何已知白名单电子邮件后缀匹配。

SELECT t1.* 
FROM user_info t1 
LEFT JOIN whitelist_email t2 
    ON t1.verified_email LIKE CONCAT('%', t2.email_suffix) 
WHERE t2.id IS NULL 
+0

谢谢。显然,我可以在6分钟内接受这个答案... –

+0

@MthethewTaylor不,谢谢你让我知道它的工作原理......你让我无需安装演示:-) –

+0

而且,在你回答之前,我在想我应该提交一个MCVE ... –

0
SELECT verified_email 
from user_info 
where SUBSTRING(verified_email,INSTR(reverse(verified_email),".")+1,length(verified_email)) 
    not in (select email_suffix from whitelist_email); 
+0

例如,在mail.yahoo.com的情况下这不起作用。 – Ashraf

+0

感谢您的回复,但它对我无效。 –

+0

用** INSTR编辑(reverse(verified_email),“。”)** – Frank

0

例如

表USER_INFO

id;verified_email 
1;[email protected] 
2;[email protected] 

表whitelist_email

id;email_suffix 
1;example.com 
2;stackoverflow.com 

查询

select * 
from user_info u 
where not exists(
    select * 
    from whitelist_email 
    where whitelist_email.email_suffix=substr(u.verified_email,locate('@',u.verified_email)+1) 
) 

结果

id,verified_email 
1,[email protected] 

这是更有效的邮件帐户和邮件域存储在不同的领域。

+0

感谢您的回复,但这似乎不起作用。 –

+0

它的工作原理。我从实例中复制了它。 – venoel

+0

我想我看到了这个问题 - 看起来您在电子邮件地址的左侧添加了“@”,这不是一个有效的假设。 (例如,我的白名单中的一个条目是'.edu',我假设是正确的还是错误的,以.edu结尾的任何电子邮件地址都是合法的) –