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)