2012-07-23 202 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