MySQL不在或不是REGEXP

时间:2014-09-23 13:20:11

标签: mysql

我有两张桌子:votersbanned_domains 除了被禁止的域名外,我想获得所有选票 此查询效果很好

SELECT * FROM `voters` email NOT REGEXP('tempmail.com|tempmail.org')

我想与另一个表的请求进行比较,但此代码不起作用:

SELECT * FROM `voters` email NOT IN(SELECT domain FROM banned_domains)

非常感谢

更新:我为不完整的数据道歉。 在voters我有一个完整的电子邮件地址 例子' oleole@mail.com' 但在banned_domains我只有域名 例子' mail.com'

我更改了查询,但它不起作用

SELECT * FROM  voters
WHERE DISTINCT RIGHT(  voters.email , LENGTH(  voters.email ) - LOCATE(  '@', voters.email ) ) NOT IN (SELECT domain FROM banned_domains)

ERROR:#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DISTINCT RIGHT(  voters.email , LENGTH(  voters.email ) - LOCATE(  '@', voters.e' at line 2 

3 个答案:

答案 0 :(得分:2)

您的查询更改中缺少where

SELECT * FROM `voters` email NOT IN(SELECT domain FROM banned_domains)

SELECT * FROM `voters` WHERE email NOT IN(SELECT domain FROM banned_domains)

答案 1 :(得分:1)

您需要在电子邮件和域名之间执行REGEXP匹配,但NOT IN执行完全匹配。

SELECT v.*
FROM voters AS v
LEFT JOIN banned_domains AS d ON v.email REGEXP d.domain
WHERE d.domain IS NULL

答案 2 :(得分:0)

典型的原因是domainNULL个值。您可以通过明确过滤掉这些来解决这个问题:

SELECT *
FROM `voters`
WHERE email NOT IN (SELECT domain FROM banned_domains WHERE domain is not null);

但是,我更喜欢使用NOT EXISTS,因为语义更符合人们的期望:

SELECT v.*
FROM `voters` v
WHERE NOT EXISTS (SELECT 1 FROM banned_domains bd WHERE bd.domain = v.domain);

注意:我认为问题不是缺少where子句,因为您声称第一个查询有效。