我知道问题似乎重复,但我不知道如何以不同的方式提出问题。
我在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吗?
我更新了我的查询以使用等号连接。
答案 0 :(得分:3)
您是否尝试过使用GROUP BY friend_id进行LEFT JOIN查询?如果用户不存在,则不会在结果中添加一行。
答案 1 :(得分:0)
如果您所做的只是清理表格,那么您有一定的灵活性,因为查询运行缓慢不会产生很大的影响,因为您只想运行一次。以下是几个不同的选择:
使用左连接查找朋友中的行,而不在users表中显示相应的朋友ID(未经测试):
SELECT Friends.id,Users.user_id 来自朋友LEFT JOIN Friends.friend_id = Users.user_id上的用户 WHERE Users.user_id为NULL
然后删除您找到的记录
使用内部联接来完成存在的朋友。然后创建一个包含这些记录的新表(未经测试)
SELECT Friends.id,Users.user_id FROM Friends INNER JOIN Friends.friend_id = Users.user_id
上的用户并将结果行插入一个新表格,该表格将成为您的新“朋友”表格。
希望有所帮助
答案 2 :(得分:-1)
我不明白为什么你在这里做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的索引......