2010-11-03 58 views
0

我有一张桌子,里面充满了Twitter更新的500.000条记录。然后我得到一个包含用户信息的表格。内部连接只返回7条记录

我基本上需要我用户表中所有人的Twitter记录。

我可以用这个请在查询做到这一点:

SELECT * 
FROM STATUS WHERE twitterUserID 
IN ( 
    SELECT twitteruserid 
    FROM accountLink 
) 

但是,这显然是非常缓慢的。

然后我试图用连接来做,但它只显示7条记录。不知道为什么。

SELECT status . * , accountLink.userId, accountLink.twitterUserId 
FROM status 
JOIN accountLink 
ON status.twitterUserId = accountLink.twitterUserId 

有谁知道什么会导致这种行为,以及如何解决它?

+0

SELECT * 从状态为S 内加入accountLink作为上s.twiteruserid = a.twitteruserid 尝试。 – 2010-11-03 20:38:13

+1

如果有的话,我希望第二个查询会给你比第一个更多的行。你能否创建一小组数据来证明问题?每张表格的数据,预期结果以及所获得的数据都会非常有用。 – 2010-11-03 20:53:18

回答

1

尝试更改为此:

SELECT status.* , accountLink.userId, accountLink.twitterUserId 
FROM status 
LEFT JOIN accountLink 
ON status.twitterUserId = accountLink.twitterUserId 

我怀疑,有没有对所有的状态和帐户链接的记录匹配。无论accountLink是否匹配,执行左连接都会选择每个status

+0

我认为,起初,但我读到原来的“IN”声明的方式,听起来好像他只是试图获得帐户有accountLink匹配的状态...所以我不知道为什么2陈述不要给同样的回报... – GendoIkari 2010-11-03 20:49:14

+1

是的,这是一个很好的观点。我可能不得不查看你的数据,找出你为什么看到这个。两个表的'twitterUserId'是一个int吗? – 2010-11-03 20:51:29

+0

这可能是一个类型转换问题 - IN()将在类型之间进行转换,而=不会。需要更多架构信息。 – Hamish 2010-11-03 20:52:27

0

JOIN语法应该工作,除非列数据类型不同。

MySQL Documentation for IN()

使用二进制搜索的项目,然后完成搜索。这意味着IN值非常快,如果IN值列表完全由常量组成。否则,根据第11.2节“表达式评估中的类型转换”中描述的规则进行类型转换,但将其应用于所有参数。

确保列类型匹配应确保JOIN语法正常工作。

0
SELECT s.*, a.twitterUserId, a.userId 
FROM status AS s INNER JOIN accountLink AS a 
WHERE s.twitterUserId=a.twitterUserId 

你想使用内部连接,因为你只想要返回的结果,如果“状态”表中有一个记录和相应的用户记录在“accountLink”表中找到。如果“状态”表记录没有相应的用户条目,则不应显示它(至少根据您的帖子)。即使在accountLink表中没有匹配的条目,LEFT OUTER JOIN也会显示状态表记录。

下面是学习SQL一个很好的资源连接:
SQL Joins (w3schools.com)