我正在制作一个非常简单的论坛,其中有一个名为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
正如您可能猜到的那样,我正在制作论坛列表,供人们选择论坛帖子去查看。
答案 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(显然这不正确)。