2

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

我在 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?

我已更新我的查询以使用相等连接。

4

3 回答 3

3

您是否尝试过使用 GROUP BYfriend_id 的 LEFT JOIN 查询?如果用户不存在,它不会在结果中添加一行。

于 2013-02-03T23:17:34.793 回答
0

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

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

    SELECT Friends.id, Users.user_id FROM Friends LEFT JOIN Users on Friends.friend_id = Users.user_id WHERE Users.user_id 为 NULL

    然后删除你找到的记录

  2. 使用内部连接来查找存在的朋友。然后用这些记录创建一个新表(未经测试)

    SELECT Friends.id, Users.user_id FROM Friends INNER JOIN Users on Friends.friend_id = Users.user_id

    并将结果行插入到一个新表中,该表将成为您的新“朋友”表。

希望有帮助

于 2013-02-03T23:38:21.567 回答
-1

我不明白你为什么在这里做 CASE 构造。如果您想获取 users 表中不存在的所有朋友 ID 的列表,那么类似:

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 的索引...

于 2013-02-03T23:18:45.467 回答