2013-02-03 74 views
2

我知道这个问题似乎重复,但我不知道如何以不同的方式提出问题。如何检查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?

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

回答

3

您是否尝试过使用GROUP BY friend_id进行LEFT JOIN查询?如果用户不存在,则不会将结果添加到行。

+0

我还没有试过呢,但现在,我尽量不会给任何结果,因为它真的很慢的任意查询。 – toy

-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指数...

0

如果你只是在清理表格,那么你有一定的灵活性,因为查询运行缓慢的事实不会有太大的影响,因为你只需要运行一次。这里有几个不同的选择:

  1. 使用LEFT JOIN找到朋友行,而不在用户表(未经测试)对应的好友ID:

    SELECT Friends.id,Users.user_id 朋友LEFT JOIN上Friends.friend_id = Users.user_id 用户WHERE Users.user_id是NULL

    然后删除记录您发现

  2. 使用一个内连接到翅片存在的朋友。然后创建这些记录(未经测试)

    SELECT Friends.id,Users.user_id 朋友INNER JOIN上Friends.friend_id = Users.user_id用户

    ,并将所得行插入一个新表的新表这将成为你的新的“朋友”表。

希望帮助

相关问题