如何查找一个表中的条目与另一个表中的条目不同

时间:2017-07-07 14:32:39

标签: mysql

我有一个名为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
);

3 个答案:

答案 0 :(得分:1)

一种方法是LEFT JOIN user_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

答案 1 :(得分: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);

答案 2 :(得分:0)

例如

表user_info

id;verified_email
1;u1@tu.com
2;u2@example.com

表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,u1@tu.com

将邮件帐户和邮件域存储在单独的字段中效率更高。