我有两张桌子:voters
,banned_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
答案 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)
典型的原因是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
子句,因为您声称第一个查询有效。