如何检查id是否存在于另一个表中,给定表是3000万条记录



我知道这个问题似乎是重复的,但我不知道如何以不同的方式提问。

我在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 进行左联接查询?如果用户不存在,则不会向结果添加行。

如果您所做的只是清理表,那么您具有一定的灵活性,因为查询运行缓慢的事实不会产生很大影响,因为您只想运行一次。以下是几个不同的选项:

  1. 使用左连接在"用户"表中查找"朋友"中没有相应朋友 ID 的行(未经测试):

    选择 Friends.id,Users.user_id从 朋友 左 加入 用户 上 Friends.friend_id = Users.user_id其中Users.user_id为空

    然后删除找到的记录

  2. 使用内部联接来对存在的好友进行 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的索引...

相关内容

  • 没有找到相关文章

最新更新