2012-07-23 160 views
2

我目前正在尝试开发一个论坛。现在我遇到了一个小障碍。我在我的数据库中有四张表; “类别”,“论坛”,“主题”和“回复”。他们都有一个ID,一个父母身份和一个名字。COUNT,GROUP BY,INNER JOIN,php,mysql

我现在的问题是我应该如何存储和获取每个类别和论坛的主题和答复的数量。起初我想将所有主题和回复保存在每个类别和论坛中,并且将所有回复保存在每个主题中。

但这是我宁愿尽量避免看到的事情,因为我必须为每次回复做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属于论坛的主题。

+0

您的问题不明确。您可以将它作为数据结构问题(按照第二段)或作为查询问题(按照后续段落)来重述吗? – 2012-07-23 14:12:40

+0

有两个问题,所以这可能是为什么;我为不够清洁而道歉。 a)是否有像我这样粘贴的查询可能?如果是这样如何?我想加入每个论坛的主题和回复数量。 b)如果不可能,那么解决方案将主题和答复作为整数存储在类别和论坛表格中? – Emz 2012-07-23 14:25:38

回答

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; 

希望有所帮助,但如果这不是你想达到什么样的,请为您添加精确度问题。

+0

这很好,谢谢。 – Emz 2012-07-23 14:54:41

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` 

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

+0

这也解决了。谢谢。 – Emz 2012-07-23 14:54:58