2012-06-23 32 views
4

這是一個簡單的問題 - 我只是找到了不同的答案,所以我不確定。讓我描述:LIMIT在JOIN之前或之後有效嗎?

如果您有疑問,像這樣的:

SELECT logins.timestamp, users.name 
FROM logins 
LEFT JOIN users 
ON users.id = logins.user_id 
LIMIT 10 

這基本上將列出登錄表的最後10個條目,在JOIN的用戶名替換USER_ID。

現在我的問題是,當連接發生(所以它只加入前10個條目)或連接後LIMIT是否生效? (它會加入整個表格,然後刪除前10個條目)

我在問這是因爲示例表logins將包含很多條目 - 而且我不確定連接是否太昂貴明智的。如果LIMIT只會發生10 JOIN,那不會是一個問題。

第二個問題是這樣的:如果添加了DISTINCT,功能是否一樣?它會在10個參賽作品中停止嗎?並且不,這不會被命令由命令

+1

*這基本上會列出登錄表的最後** 10個條目* - 不,它不會。沒有'ORDER BY'子句=沒有保證的順序。 – DCoder

+0

@Dcoder,但'默認'排序受表格插入的影響,對吧?所以,如果你認爲你永遠不會'更新'任何行,但只執行'INSERT',那麼順序將始終是INSERT順序,對嗎? - 對於這個問題,我只使用表格作爲歷史表格,稍後在沒有任何操作數據的情況下 – Katai

+0

據我所知,每個供應商都可以按照他們認爲合適的方式實施默認排序,因此結果通常會根據到查詢中使用的任何索引 - 這種方式引擎不需要花費額外的時間來訂購。 – DCoder

回答

5

不要擔心。 LIMIT將與連接同時發生:MySQL不會讀取整個登錄表,而是逐行讀取(每次加入用戶),直到找到10行。

請注意,如果users.id在表中出現兩次,JOIN將複製登錄行並添加每個用戶行。線路總數仍爲10,但您將有9個登錄。

+0

+1。從我所知道的你是對的,但它可能是特定於實現的。例如,某人可能已經實現了一個引擎,該引擎可以在'JOIN'正在執行時執行'LIMIT' ** IF **沒有'ORDER BY'子句。我不知道這樣的事情,這只是一個想法:)。 –

+0

引擎確實可以指定自己的行爲。對於訂單來說,限額總是在訂單之後完成。您需要在加入訂單選擇字段時使用密鑰。 – Konerak

+0

謝謝你的答案 - 是的,該順序可能會改變這個問題的結果對我來說很清楚 - 但我不會使用它(已經按照正確的日期順序插入行)。我現在又遇到了第二個問題 - DISTINCT是什麼? (我會編輯我的問題 - 請回答如果可以的話,但無論如何,我現在都會接受這個答案,因爲它正是我所需要知道的) – Katai

相關問題