我有以下表格:
Table 1 : Contacts
Fields : id first_name
Values :
1 Reeta
2 Rohan
3 John
Table 2 : email (it contains contact_id of contacts table)
Fields : id contact_id email_address
Values :
1 1 r@gmail.com
2 2 r@gmail.com
3 3 j@gmail.com
我想通过电子邮件显示所有重复项。像这样:
cont_id first_name email_address
1 Reeta r@gmail.com
2 Rohan r@gmail.com
这是我的问题:
select contact_id
from contacts
where email_address IN (
SELECT S.email_address
FROM contacts R
INNER JOIN email
ON R.id = S.contact_id
Group By email_address
Having Count(S.id) > 1
);
查询需要很长时间才能执行大量记录。然而,内部查询工作得更快,但不是外部查询。请帮助。
答案 0 :(得分:0)
我会将您的INNER JOIN
移到您的子查询之外。
SELECT
c.contact_id,
c.first_name,
e.email_address
FROM contacts c
INNER JOIN email e ON c.id = e.contact_id
WHERE e.email_address IN (
SELECT email_address
FROM contacts
GROUP BY email_address
HAVING COUNT(id) > 1
);
你也可以实现MySQL的EXPLAIN
来更好地了解你的查询是什么窒息。
答案 1 :(得分:0)
另一种方法,应该更快,就是这样:
select email.email_address, group_concat(contacts.contact_id)
from contacts inner join email on contacts.contact_id=email.contact_id
group by email.email_address
having count(contacts.contact_id) > 1;
现在,你得到了你想要的东西;唯一的是,联系人ID将以逗号分隔的字符串连接。但是你会知道哪些电子邮件地址是非唯一的。
您还应该在所有表格中contact_id
上都有索引(因为您加入了这些字段),也可能email_address
也是如此(因为您搜索它)。