2013-04-30 51 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