将两个查询合并成一个
问题描述:
我在写一个查询时遇到了一些问题。这似乎是非常频繁的表格结构,所以我想要一些帮助。将两个查询合并成一个
比方说,我有3个表类似于facebook结构。 Users
,Wall Posts
和Comments
。用户可以制作墙贴,并评论其他墙贴。
在用户页面上,我想显示用户墙上的帖子以及该帖子有多少评论的次数。这是我到目前为止
我查询Wall Post
表使用用户id作为User
表的内部联接。这给了我一个该用户页面的墙贴的结果集。然后,我遍历该结果集,从每个结果集中获取Wall Post ID,然后查询Comment
表,获取该Wall Post Id的评论计数。这工作,但我必须打两次分贝。任何人都可以想出一种方法,我可以用一个查询做到这一点?
首先查询示例:
SELECT wallPost.*, user.currentDefault, user.displayName, user.userName
FROM wallPost
INNER JOIN user ON user.id = wallPost.sourceUserId
WHERE wallPost.recipientId = ? ORDER BY wallPost.id DESC
第二个查询示例:
SELECT COUNT(id) AS count
FROM comment
WHERE wallPostId = ?
答
我想补充算作一个子查询并加入子查询主查询
SELECT
wallPost.*,
user.currentDefault,
user.displayName,
user.userName,
wallpost_commentcount.total
FROM
wallPost
INNER JOIN user ON user.id=wallPost.sourceUserId
LEFT JOIN (SELECT wallPostId,COUNT(*) as total FROM comment GROUP BY wallPostId) as wallpost_commentcount ON (wallpost_commentcount.wallPostId=wallPost.id)
WHERE
wallPost.recipientId = ?
ORDER BY wallPost.id DESC
请确保你有一个comment.wallPostId
索引,否则这个查询将需要很长时间。
我用LEFT JOIN
因为你总是希望得到wallPost即使有任何意见记录还
首先你是一个天才。我需要一些帮助来理解这一点。首先,为什么这个小组?你不能只用点数来计数吗? – gmustudent 2013-03-09 01:40:53
如果你自己运行子查询,你会明白为什么 - 你得到每个wallpost的所有wallposts和COUNT()评论,然后加入外部查询的结果集 – 2013-03-09 01:42:44
@gmustudent:你想按照' wallPostId',而不是表'comment'中的所有内容,所以你需要添加'GROUP BY wallPostId' - 至少根据SQL标准。 – 2013-03-09 01:43:32