2014-09-23 164 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