2

我目前(试图)开发一个论坛。现在我遇到了一个小障碍。我的数据库中有四个表;“类别”、“论坛”、“主题”和“回复”。他们都有一个id、一个父id和一个名字。

我现在的问题是我应该如何存储和获取每个类别和论坛的主题和回复的数量。一开始我想保存每个分类和论坛中的所有主题和回复,以及保存每个主题中的所有回复。

但这是我宁愿避免看到的事情,因为我必须为每个回复进行 1 次插入和 3 次更新;1 到类别,1 到论坛,1 到主题,最后是回复本身,插入。

所以相反,我想是否有可能(以及如何)使用 COUNT、GROUP BY 和 INNER JOIN 进行查询

沿线的东西

SELECT * 
  FROM `categories`
  JOIN (COUNT ( * )
         FROM `topics`
     GROUP BY `parent_id`
        WHERE `parent_id` = `categories`.`id`) as `amount_of_topics`
  JOIN (COUNT ( * )
         FROM `topics`
     GROUP BY `parent_id`
        WHERE `parent_id` = `topics`.`id`) as `amount_of_replies`

只是我没有按照我想要的方式工作。

因此,要获取特定论坛的所有回复并计算它们,回复和论坛得到的连接是回复的 parent_id 属于一个主题,而该主题的 parent_id 属于一个论坛。

4

2 回答 2

3

我不确定我是否正确理解了您的问题,但如果您只想要特定论坛的主题和回复数(前提是类别属于论坛而不是相反),您可以沿着这条线进行查询:

SELECT  forums.ID as forum_id
,       forums.name as forum_name
,       Count(topics.ID) AS count_of_topics
,       Count(replies.ID) AS count_of replies
FROM forums 
    LEFT JOIN categories ON forums.ID = categories.parent_id 
    LEFT JOIN topics ON categories.ID = topics.parent_id 
    LEFT JOIN replies ON topics.ID = replies.parent_id
GROUP BY forums.ID, forums.name, categories.ID, categories.name;

如果您要按类别查找主题和回复的数量,请使用:

SELECT  categories.ID as category_id
,       categories.name as category_name
,       Count(topics.ID) AS count_of_topics
,       Count(replies.ID) AS count_of replies
FROM categories
    LEFT JOIN topics ON categories.ID = topics.parent_id 
    LEFT JOIN replies ON topics.ID = replies.parent_id
GROUP BY forums.ID, forums.name, categories.ID, categories.name;

希望这会有所帮助,但如果这不是您想要达到的目标,请在您的问题中添加精确度。

于 2012-07-23T14:26:09.430 回答
0

我认为这是您想要的查询:

SELECT categories.*, `amount_of_topics`, `amount_of_replies`
FROM `categories` JOIN
      (select `parent_id`, COUNT ( * ) as `amount_of_topics` 
       FROM `topics`
       GROUP BY `parent_id`
     )  tp
     on tp.`parent_id` = `categories`.`id`) JOIN
     (select `topics`.`id`) , COUNT ( * ) as `amount_of_replies`
      FROM `topics` 
      GROUP BY `topics`.`id`
    ) ti
    on  tp.`parent_id` = ti.`id`

这个想法是为您想要的每个主题组创建单独的子查询,然后将它们连接在一起。

于 2012-07-23T14:48:44.717 回答