2013-03-09 217 views
2

我在写一个查询时遇到了一些问题。这似乎是非常频繁的表格结构,所以我想要一些帮助。将两个查询合并成一个

比方说,我有3个表类似于facebook结构。 Users,Wall PostsComments。用户可以制作墙贴,并评论其他墙贴。

在用户页面上,我想显示用户墙上的帖子以及该帖子有多少评论的次数。这是我到目前为止

我查询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 = ? 

回答

2

我想补充算作一个子查询并加入子查询主查询

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即使有任何意见记录还

+0

首先你是一个天才。我需要一些帮助来理解这一点。首先,为什么这个小组?你不能只用点数来计数吗? – gmustudent 2013-03-09 01:40:53

+0

如果你自己运行子查询,你会明白为什么 - 你得到每个wallpost的所有wallposts和COUNT()评论,然后加入外部查询的结果集 – 2013-03-09 01:42:44

+1

@gmustudent:你想按照' wallPostId',而不是表'comment'中的所有内容,所以你需要添加'GROUP BY wallPostId' - 至少根据SQL标准。 – 2013-03-09 01:43:32