2014-09-23 196 views
0

我有2个表:votersbanned_domains 我想所有的选票,除非禁止域 此查询工作以及MySQL的NOT IN或NOT REGEXP

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

我想请求另一个比较表,但是这个代码不工作:

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

非常感谢

UPDATE:我对不完整的数据表示歉意。 在voters我有一个完整的电子邮件地址 例如“[email protected]” 但在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 
+1

当你说“不行”,是它;语法错误,结果错误,什么?此外,看起来像缺少'WHERE' – 2014-09-23 13:21:38

+1

'NOT IN'完全匹配,它不会执行REGEXP匹配。 – Barmar 2014-09-23 13:22:59

+1

这两个查询都缺少where子句。如果第一个作品,我认为这只是一个印刷错误。 – 2014-09-23 13:24:11

回答

0

您需要执行电子邮件和网域之间的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 
+0

亲爱的Barmar,我将exicute查询,但收到错误#1267 - 非法混合排序规则(utf8_unicode_ci,IMPLICIT)和(utf8_general_ci,IMPLICIT)对于操作'regexp' – 2014-09-23 14:22:41

+0

可能是因为它们不使用分隔符'|'? – 2014-09-23 14:25:33

+0

这是因为你对这两个表有不同的“排序规则”设置。搜索SO以获取错误消息,以了解如何解决该问题。 – Barmar 2014-09-23 14:53:14

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) 
0

对于一个典型的原因将是domain呈现NULL值。然而

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子句,因为您声明第一个查询有效。

+0

为什么禁止域列表在域列中包含空值? – Barmar 2014-09-23 13:25:52

+0

@Barmar。 。 。也许是因为域名被禁止然后被删除。这不是我的数据库,所以我显然不知道。我怀疑问题是'where'子句,因为OP宣称第一个版本有效。 – 2014-09-23 13:33:33