使用LIMIT了解GROUP BY

时间:2013-04-30 06:08:26

标签: mysql sql

我有一个简单的SQL查询,可以向我提供有关对此图像进行评论的所有用户的信息......

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,然后在整个表格中搜索第二个唯一身份用户
  3. 我希望这个查询能够做到#1,因为如果它确实#2会导致它搜索整个表,寻找第二个用户,而“Mike”实际上就是那个做出两个注释的用户。我确实尝试了EXPLAIN,但我并不理解它,因为无论是GROUP BY还是LIMIT,它都会提供相同的输出。谢谢你的阅读。

3 个答案:

答案 0 :(得分:2)

查询找到评论了Image的前两个用户,因此它是#2。

我建议:

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

where存在比内连接快,因为它可以在第一个之后停止。应该设置好的指数。

答案 1 :(得分: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

答案 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