2012-04-12 56 views
0

在網頁上,我想顯示論壇列表(parent_id = 0) ,併爲每個論壇顯示最新(最新)該組論壇的3個主題和它的子論壇MySQL將論壇及其子論壇分組到同一組,然後做最大的每組

APPLE (Forum) 
iPad3  Apr 12 (Topic from subForum "Tablets") 
Genius Bar Apr 11 (Topic from Forum "APPLE") 
iPodNano  Apr 10 (Topic from subForum "Portables") 
repeat with next forum 

的MySQL 5.5結構

table FORUMS (contains Forums and subForums, 2 level hierarchy max) 
id (autoinc) 
parent_id (0 if Forum, link to other rows id if subForum) 
name 


table TOPICS (a Topic is a child of Forums or subForums) 
id (autoinc) 
forum_id (linked to FORUMS table 
name 
date_added (datetime) 

我能得到的結果設置論壇從一個簡單的查詢,到PHP中的數組和環通說。

我被困在如何創建顯示前3個主題的第二個結果集。

我已閱讀關於Greatest-N-Per-Group的文章,並嘗試過他們,但我認爲我的想法增加了複雜性。我的大腦在這一點上很好,所以我在尋求幫助。

我是否創建一個mysql變量來保存論壇ID和它的子論壇的逗號分隔的列表,然後將它用於IN(1,4,6)語句的值?

或者這是一個糟糕的設計/想法,而且執行成本太高?

我已經閱讀了許多相關的帖子,但任何鏈接,你可以指向我我也會讀。

+1

你已經解釋說論壇有subforums,但是subforums可以有更多的subforums嗎?您沒有包含論壇表格的結構。論壇層次結構是否遵循與類別相同的層次結構? – nnichols 2012-04-13 00:04:40

+0

對不起,我意識到我的問題被描述得很糟糕,使用Cats&Prods而不是論壇和主題。我編輯它以匹配我的描述。原創帖子發佈時,我的大腦真的很糟糕。 我只想要有2個級別,一個頂級(可以包含主題)和一個較低級別的頂級子級。我不需要更多的複雜性:) – 2012-04-13 00:56:35

+0

我已經更新了我的答案。 – nnichols 2012-04-13 01:04:43

回答

1

由於您的問題缺乏清晰度,我不得不作出一些假設,但您應該能夠修改此以適合您的表/字段名稱。我在最裏面的查詢中包含了一個基於日期的過濾器來嘗試減少開銷。您可能需要修改topics.date_added > (CURRENT_DATE - INTERVAL 1 MONTH)標準,以確保您始終擁有每個論壇組3項 -

SELECT * 
FROM (
    SELECT 
     tmp.*, 
     @rank := IF(@forum=forum_id, @rank + 1, 1) rank, 
     @forum := forum_id 
    FROM (
     SELECT 
      forums.id AS forum_id, 
      forums.name AS forum_name, 
      NULL AS subforum_id, 
      NULL AS subforum_name, 
      topics.name AS topic_name, 
      topics.date_added 
     FROM forums 
     INNER JOIN topics 
      ON (forums.id = topics.forum_id) 
     WHERE topics.date_added > (CURRENT_DATE - INTERVAL 1 MONTH) 
     AND forums.parent_id = 0 
     UNION ALL 
     SELECT 
      forums.id AS forum_id, 
      forums.name AS forum_name, 
      subforums.id AS subforum_id, 
      subforums.id AS subforum_name, 
      topics.name AS topic_name, 
      topics.date_added 
     FROM forums 
     INNER JOIN forums subforums 
      ON forums.id = subforums.parent_id 
     INNER JOIN topics 
      ON subforums.id = topics.forum_id 
     WHERE topics.date_added > (CURRENT_DATE - INTERVAL 1 MONTH) 
     AND forums.parent_id = 0 
     ORDER BY forum_id ASC, date_added DESC 
    ) tmp, (SELECT @forum:=NULL, @rank:=NULL) initvars 
) tmp2 
WHERE rank <= 3 

注:我沒有嘗試這樣做所以可能有語法錯誤。

+0

** HOLY $#!+ **它的工作原理! **謝謝_nnichols __!**起初我被這個問題的大小嚇倒了,我正要放棄我的夢想。我得到了一些好的睡眠,並在第二天進行攻擊,遍歷整個查詢,瞭解每個部分都做了什麼。我已經學會了一些釣魚(不只是複製和粘貼) – 2012-04-13 17:58:40

+0

我很高興它已經解決了你的問題,並且你從中學到了東西。許多人期望得到答案,並不在意正確理解它。對你好! – nnichols 2012-04-13 19:15:54

+0

我正在處理關於查詢的文檔,描述它所做的每一個步驟,然後我會將它發佈在SO上,所以其他讀者將會學習。再次感謝你的幫助。看起來你有信用,對嗎?你有個人博客嗎? – 2012-04-14 12:26:49