我这里有两个表:一个包含订阅者电子邮件列表:
(ID, email)
另一个包含域列表:
(ID, domain)
我想弄清楚一个sql语句,它允许我select *
属于域表中列出的域的电子邮件地址,假设所有电子邮件都是以下形式:
name@domain
这可以在sql中完成,还是需要为此编写脚本?
答案 0 :(得分:5)
您应该能够执行以下操作:
SELECT
sub_emails.email
FROM
sub_emails
INNER JOIN
list_domains ON
(sub_emails.email LIKE concat('%@', list_domains.domain_name));
请注意,这需要sub_emails
的全表扫描,因为MySQL还不支持基于函数的索引。因此,如果sub_emails
包含许多记录,这将变得非常慢。
答案 1 :(得分:2)
从这里开始:
select email from EmailTable
where substring(email, charindex('@', email) + 1, LEN(@test))
in (select domain from DomainTable)
如果您的任何电子邮件缺少@,这将失败,但它会让您入门。
答案 2 :(得分:2)
SELECT email FROM emailTable WHERE
SUBSTRING(email, LOCATE('@',email)) IN (SELECT domain FROM domainTable)
答案 3 :(得分:2)
SET @myregexp := CONCAT(
'@(',
(SELECT GROUP_CONCAT( REPLACE(domain,'.','\.') SEPARATOR '|' ) FROM `domains` ) ,
')$'
);
SELECT *
FROM `emails`
WHERE email
REGEXP @myregexp