我有一个简单的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
因为我只想显示一次用户的信息,即使他们多次评论。
让我们说“迈克”两次对照片发表评论。我的问题是,这个查询......
LIMIT
而仅搜索2条评论,然后执行GROUP BY user.id
GROUP BY user.id
,然后在整个表格中搜索第二个唯一身份用户我希望这个查询能够做到#1,因为如果它确实#2会导致它搜索整个表,寻找第二个用户,而“Mike”实际上就是那个做出两个注释的用户。我确实尝试了EXPLAIN
,但我并不理解它,因为无论是GROUP BY
还是LIMIT
,它都会提供相同的输出。谢谢你的阅读。
答案 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