2013-04-30 49 views
1

我有一個簡單的SQL查詢來給我有關的所有誰有一個這樣的圖像上評論的用戶信息...瞭解GROUP BY與LIMIT

SELECT user.id, user.userName, user.displayName, user.currentDefault, user.discipline 
FROM user 
INNER JOIN imageComment ON user.id = imageComment.commentAuthorId 
WHERE imageComment.imageAlbumJunctionId = 37 
GROUP BY user.id 
LIMIT 2 

我有LIMIT 2在那裏因爲我知道這張圖片只有兩條評論。我有GROUP BY user.id那裏,因爲我只想顯示一次用戶的信息,即使他們多次評論。

因此,讓我們說「邁克」兩次評論一張照片。我的問題是,這是否查詢...

  1. 僅搜索因爲LIMIT爲2條,然後執行GROUP BY user.id
  2. 執行GROUP BY user.id然後搜索全表的第二唯一用戶

我希望這個查詢執行#1,因爲如果#2會導致它搜索整個表尋找第二個用戶時,「邁克」實際上是做了這兩個評論。我確實嘗試了EXPLAIN,但我並不真正瞭解它,因爲無論是GROUP BY還是LIMIT,它都會提供相同的輸出。謝謝你的閱讀。

回答

2

該查詢找出誰曾評論的圖片前兩個用戶,所以它的#2。

我建議:

select ... 
from user 
where exists 
(
    select * from imageComment 
    where imageComment.commentAuthorId = user.id 
    and imageComment.imageAlbumJunctionId = 37 
) 

其中存在比內連接,因爲它可以在第一後停止更快。應該設定好的指數。

+0

導致我做在哪裏存在着一些閱讀。謝謝你的額外獎勵。直到現在還不知道它的好處。 – gmustudent 2013-04-30 06:40:48

0

LIMIT適用於GROUP BY user.id之後。所以在這種情況下,#2正在發生。但WHERE子句將首先篩選表,因此它不會搜索整個表。您的查詢會給你正確的結果,但我認爲這應該是更好:

SELECT DISTINCT user.id, user.userName, user.displayName, user.currentDefault, user.discipline 
FROM user 
INNER JOIN imageComment ON user.id = imageComment.commentAuthorId 
WHERE imageComment.imageAlbumJunctionId = 37 
LIMIT 2 
0

示例表

User Table       imageComment Table 
id | userName      id | commentAuthorId | imageAlbumJunctionId 
---------------      ------------------------------------------- 
1 | Mike       1 | 1    | 37 
2 | John       2 | 1    | 37 
3 | Carla       3 | 2    | 37 
            4 | 3    | 37 

關於

SELECT user.id, user.userName 
FROM user 
INNER JOIN imageComment ON user.id = imageComment.commentAuthorId 
WHERE imageComment.imageAlbumJunctionId = 37 

什麼打算拆分解釋後,這將返回

1 | Mike 
1 | Mike 
2 | John 
3 | Carla 

GROUP BY user.id你現在得到

1 | Mike 
2 | John 
3 | Carla 

現在我們使用的LIMIT 2並獲得

1 | Mike 
2 | John