SQL问题 - 如何从两个表中选择属于域列表的所有电子邮件?

时间:2010-02-06 08:10:32

标签: php sql mysql

我这里有两个表:一个包含订阅者电子邮件列表:

(ID, email)

另一个包含域列表:

(ID, domain)

我想弄清楚一个sql语句,它允许我select *属于域表中列出的域的电子邮件地址,假设所有电子邮件都是以下形式:

name@domain

这可以在sql中完成,还是需要为此编写脚本?

4 个答案:

答案 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