2014-02-26 41 views
1
Table 1 : Contacts 

id | name 
------------ 
1 | John 
2 | Shawn 
3 | Rachael 


Table 2 : emails 

id | contact_id | email_addr 
---------------------------- 
1 |  1  | [email protected] 
2 |  2  | [email protected] 
3 |  3  | [email protected] 

重复假设我找到EMAIL_ADDRESS重复我应该得到以下结果查找相关的两个表

contact_id | name | email_addr 
--------------------------------- 
    1  | John | [email protected] 
    2  | Shawn | [email protected] 

即我应该会得到重复的电子邮件的所有联系人。

我用下面的查询

​​

这个查询需要很长的时间,1000条记录,例如执行。 请帮助优化查询。

+0

发布您的表格结构 –

+0

@AbdulManaf:您认为问题顶部的两张表是什么? –

+0

我需要你的表索引进行优化。 –

回答

0

你或许应该避免通过使用一个连接,你应该避免在子查询中加入:

SELECT A.contact_id, A.name, A.email_addr 
    FROM email_address AS A 
    JOIN (SELECT S.email_addr 
      FROM email_addr 
     GROUP BY email_addr 
     HAVING COUNT(*) > 1 
     ) AS C 
    ON C.email_addr = A.email_addr; 
0

尝试这些指标

CREATE INDEX idx_email ON emails(email_addr,contact_id); 

CREATE INDEX idx_id ON Contacts(id); 
0

此查询将返回所有邮件在电子邮件中有多个表

SELECT tbl2 . * FROM emails tbl1 LEFT JOIN emails tbl2 ON 
    tbl1.email_addr = tbl2.email_addr AND tbl1.id <> tbl2.contact_id 
    WHERE tbl2.id >0 GROUP BY contact_id  
0

这个工作更快:

select e.contact_id, c.name,e.email_addr from Contacts as c inner join emails as e on c.id=e.contact_id group by e.email_addr having count(e.email_addr)>1 
0

试试下面的查询:

SELECT a.contact_id FROM email_addr a, (SELECT S.email_addr FROM contacts R JOIN email_addr S ON R.id = S.contact_id GROUP BY email_addr HAVING COUNT(S.contact_id) > 1) b WHERE a.email_addr=b.email_addr; 

注:更好的效果,EMAIL_ADDR场应该被索引。