gpt4 book ai didi

MYSQL - 选择两个表之间的唯一公共(public)列 - 最有效的查询

转载 作者:行者123 更新时间:2023-11-29 05:02:44 25 4
gpt4 key购买 nike

我有两个表:

db_contacts

Phone | Name | Last_Name
--------------------
111 | Foo | Foo
222 | Bar | Bar
333 | John | Smith
444 | Tomy | Smith

users_contacts

User_ID | Phone
--------------------
1 | 123
1 | 111
2 | 222
2 | 333
3 | 111
3 | 333
4 | 444

上面的通知:

  • ID 为 2 的用户是唯一拥有电话号码 222 的用户
  • ID 为 4 的用户是唯一拥有电话号码 444 的用户

我需要通过 MySQL 查询获得这些结果。

换句话说:如果 db_contacts 中存在此号码,我如何选择所有具有唯一电话号码的用户。

我需要我的最终结果是这样的:

User_ID | Phone | Name | Last_Name
------------------------------------
2 | 222 | Bar | Bar
4 | 444 | Tomy | Smith

PS:电话列之间没有外键,因为用户可以拥有不在 db_contacts 中的电话。

在现实生活中,db_contacts 包含大约 100 万条记录,users_contacts 包含大约 500 万条记录。

我尝试过但失败了,并且花了很多时间来执行:

SELECT * 
FROM users_contacts
WHERE users_contacts.phone IN (
SELECT users_contacts.phone
FROM `users_contacts`
JOIN db_contacts ON db_contacts.phone = users_contacts.phone
GROUP BY users_contacts.phone
HAVING COUNT(users_contacts.phone) = 1
)

更新:

感谢您的回复,我已经提供了完全适合我的情况的解决方案。

最佳答案

我想你想要:

select uc.*
from user_contacts uc
where not exists (select 1
from user_contacts uc2
where uc2.phone = uc.phone and uc2.user_id <> uc.user_id
);

为了提高性能,您需要在 user_contacts(phone, user_id) 上建立索引。

另一种方法是:

select max(user_id) as user_id, phone
from user_contacts
group by phone
having count(*) = 1;

不存在 版本可能会更快。

关于MYSQL - 选择两个表之间的唯一公共(public)列 - 最有效的查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54930899/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com