将两个查询转换为一个

时间:2013-03-09 01:18:14

标签: mysql sql

我正在编写一个查询问题。这似乎是非常频繁的表结构,所以我很乐意帮助。

假设我有3个类似于facebook结构的表。 UsersWall PostsComments。用户可以发布墙贴,并评论其他墙贴。

在用户页面上,我想显示用户的帖子帖子以及帖子有多少条评论的计数。这就是我到目前为止所拥有的

我使用用户ID作为Wall Post表的内部联接来查询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 = ?

1 个答案:

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