Mysql论坛 - 获得回复数量

时间:2014-11-27 21:40:58

标签: mysql

我正在制作一个非常简单的论坛,其中有一个名为forum_posts的表格。我将回复和帖子存储在同一个表中,因为我发现它对我之前制作的评论系统非常有效。

如果帖子是回复,则它有一个reply_id,即回复的帖子的post_id。如果是根帖子'可以这么说,它对于reply_id有一个0。

我已经有了多少观点。但我想获得结果中每条记录的回复数量。

我该怎么做?

SELECT a.account_id, a.store_name, p.post_id, p.post_title, p.post_text, p.views, p.creation_timestamp, p.update_timestamp
FROM forum_posts AS p
INNER JOIN accounts AS a
ON p.account_id = a.account_id
WHERE p.reply_id > 0

正如您可能猜到的那样,我正在制作论坛列表,供人们选择论坛帖子去查看。

2 个答案:

答案 0 :(得分:1)

您需要加入自己的帖子并计算它以获得回复的数量。这对于数百万个论坛帖子来说并不是特别有效 - 大多数论坛都会对此进行非规范化并单独维护一个帖子计数属性。

然而,与你所拥有的一样,(未经测试)......

SELECT a.account_id, a.store_name, cp.* FROM
(
    SELECT p.post_id, p.post_title, p.post_text, p.views, p.creation_timestamp, 
        p.update_timestamp,  p.account_id, (COUNT(*) - 1) as replies
    FROM forum_posts AS p
    LEFT JOIN forum_posts AS p1 ON p1.reply_id > 0 AND p1.reply_id = p.post_id
    GROUP BY p.post_id
)
AS cp
INNER JOIN accounts AS a ON cp.account_id = a.account_id
WHERE cp.replies > 0

结束WHERE是可选的。我刚从你的第一个查询中复制了它。还值得注意的是,这是MySQL特定的,因为它使用GROUP BY而没有完整的非聚合列列表(但是您将问题标记为MySQL,所以没有问题)。

答案 1 :(得分:1)

SELECT account_id, store_name, post_id, post_title, post_text, views, creation_timestamp, update_timestamp, IF(reply_id IS NOT NULL, replies, 0)
FROM (
    SELECT a.account_id, a.store_name, p.post_id, p.post_title, p.post_text, p.views, p.creation_timestamp, p.update_timestamp, r.reply_id, COUNT(*) as replies
    FROM forum_posts AS p
    INNER JOIN accounts AS a
    ON p.account_id = a.account_id
    LEFT JOIN forum_posts AS r
    ON p.post_id = r.reply_id
    WHERE p.reply_id = 0
    GROUP BY p.post_id
) AS sq

如果您只想显示“root”帖子(论坛帖子)而不是回复,那么您似乎还需要p.reply_id = 0

外部查询确保没有回复的帖子(仍然在内部查询中返回)打印的回复数为0而不是1(显然这不正确)。