2017-07-07 89 views
0

我有一個表稱爲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 
); 
+0

'select verified_email from user_info where right(verified_email,length(verified_email)-INSTR(verified_email,'@'))not in(從whitelist_email選擇email_suffix);' – Ashraf

回答

1

一種方法是LEFT JOINuser_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 
+0

謝謝。顯然,我可以在6分鐘內接受這個答案... –

+0

@MthethewTaylor不,謝謝你讓我知道它的工作原理......你讓我無需安裝演示:-) –

+0

而且,在你回答之前,我在想我應該提交一個MCVE ... –

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

例如,在mail.yahoo.com的情況下這不起作用。 – Ashraf

+0

感謝您的回覆,但它對我無效。 –

+0

用** INSTR編輯(reverse(verified_email),「。」)** – Frank

0

例如

表USER_INFO

id;verified_email 
1;[email protected] 
2;[email protected] 

表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,[email protected] 

這是更有效的郵件帳戶和郵件域存儲在不同的領域。

+0

感謝您的回覆,但這似乎不起作用。 –

+0

它的工作原理。我從實例中複製了它。 – venoel

+0

我想我看到了這個問題 - 看起來您在電子郵件地址的左側添加了「@」,這不是一個有效的假設。 (例如,我的白名單中的一個條目是'.edu',我假設是正確的還是錯誤的,以.edu結尾的任何電子郵件地址都是合法的) –