我知道这个问题似乎是重复的,但我不知道如何以不同的方式提问。
我在MySQL数据库中有两个非常简单的表,第一个是表Users
id, user_id
1 1
2 3
4 4
二是表友
id, user_id, friend_id
1 1 3
2 1 4
3 1 8
我从要清理的CSV文件中转储了数据。我需要检查表 1 中是否存在friend_id。第一个表大约有 30000 行,但第二个表大约有 3000 万行。
我用这个查询来检查
SELECT u.user_id, uf.friend_id as exists_friend_ids
FROM Users u, Friends uf
WHERE u.user_id = '1'
and uf.friend_id IN (select user_id from eventify.Users)
但是,我想要的输出是这样的,但由于我无法运行上述查询来实际给出我的测试结果,因此我无法继续。
user_id, exists_friend_ids
1 3
1 4
您可以看到 8 不存在,因为它在 Users 表中不存在。但是由于第二个表有超过 3000 万条记录,它在我的计算机上永远运行。我做得对还是这是唯一的方法。或者我应该学习Hadoop?
我已经更新了我的查询以使用等联接。
您是否尝试过使用 GROUP BY friend_id 进行左联接查询?如果用户不存在,则不会向结果添加行。
如果您所做的只是清理表,那么您具有一定的灵活性,因为查询运行缓慢的事实不会产生很大影响,因为您只想运行一次。以下是几个不同的选项:
-
使用左连接在"用户"表中查找"朋友"中没有相应朋友 ID 的行(未经测试):
选择 Friends.id,Users.user_id从 朋友 左 加入 用户 上 Friends.friend_id = Users.user_id其中Users.user_id为空
然后删除找到的记录
-
使用内部联接来对存在的好友进行 FIN。然后使用这些记录创建一个新表(未经测试)
选择 Friends.id,Users.user_id来自 朋友 内部加入 用户 上 Friends.friend_id = Users.user_id
并将生成的行插入到一个新表中,该表将成为新的"朋友"表。
希望有帮助
我不明白你为什么在这里做 CASE 结构。如果要获取 users 表中不存在的所有friend_ids的列表,那么像这样的东西呢:
select friends.friend_id,
count(*)
from friends
where friends.friend_id not in (select users.user_id
from users)
group by 1
你当然会有一个关于users.user_id的索引...