MySQL SELECT行部分匹配来自其他TABLE的字符串

时间:2011-05-07 22:27:26

标签: mysql sql

我有两个表:一个是电子邮件,另一个是域。

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的组合一起使用?但我不知道如何将它们结合起来。

3 个答案:

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