我有两个表:一个是电子邮件,另一个是域。
Table1 Table2
id email id domain
-- ---- -- ----
1 name@domain1.com 1 domain1.com
2 name@domain2.com 2 domain4.com
3 name@domain3.com
4 name@domain4.com
现在我想从表1中选择域名与表2的域字段匹配的所有电子邮件。结果应为:
id email
-- ----
1 name@domain1.com
4 name@domain4.com
我想它可以与REGEXP和INNER JOIN的组合一起使用?但我不知道如何将它们结合起来。
答案 0 :(得分:4)
我创建了表并进行了测试,这个查询对我有用:
SELECT t1.*, t2.domain FROM t1
INNER JOIN t2 ON t1.email LIKE CONCAT('%@', t2.domain);
答案 1 :(得分:3)
洗脱1:
使用Table1.email LIKE CONCAT('%@',Table2.domain).
BIG FAT RED WARNING:此条件不可转位。如果您想要速度,请将电子邮件拆分为Table1中的地址和域,然后创建索引。
编辑:
实际上这个JOIN条件需要计数(电子邮件)xcount(域)比较,所以它可能是最慢的方式。
解决方案2:
Rob有一个非常好的观点:更快的方法是从电子邮件中提取域名(使用子字符串)并将其与域表格上的索引相匹配
SOlution 3:
最好的方法是为电子邮件的域编制索引。在Postgres中你会创建一个函数索引ON extract_domain(email)(假设你创建了一个简单的extract_domain()函数),但你不能在MySQL中这样做,所以只有域的额外列才是提高速度的方法。 / p>
如果您想了解一个域中的所有电子邮件,
Solution 1 : seq scan table emails + fast LIKE
Solution 2 : seq scan table emails + slightly slower domain extraction
Solution 3 : index scan table emails
如果您想在所有域/所有电子邮件的表域上加入:
Solution 1 : count(email)xcount(domain) comparisons, very slow
Solution 2 : seq scan table emails + index scan domains
Solution 3 : nested loop index join
对于完整的JOIN,使用合并连接或散列连接会更快,但mysql不提供这些连接。
答案 2 :(得分:2)
试试这个
SELECT t1.Id,
t1.Email
FROM Table1 t1
JOIN Table2 t2 ON t1.email LIKE CONCAT('%@', t2.Domain);