2011-11-17 43 views
2

我想要左側加入所有主題所在的表格。我試圖做的是列出所有論壇及其子類別,並同時列出最新主題Mysql LEFT JOIN - >獲取最新主題ID /主題標題

SELECT root.name AS root_name 
    , subcat.name AS subcat_name 
    , subcat.id AS subcat_id 
    , subcat.description AS subcat_description 
    , subcat.safe_url AS subcat_safe_url 
    , topics.* 
FROM forum_category AS root 
LEFT JOIN forum_category AS subcat ON subcat.parent_id = root.id 
LEFT JOIN 
(
    SELECT MAX(`last_post_time`) AS aaaa, last_post_time, topic_title 
     , topic_id, forum_id 
    FROM `forum_topics` 
    WHERE 1 
    GROUP BY forum_id 
) AS topics ON topics.forum_id = subcat.id 
WHERE root.parent_id = 0 
ORDER BY root_name, subcat_name 

但我現在有點卡住了:(,它如此接近,但目前只列出各個子論壇的第一個話題,我需要的最後一個,但不知道怎麼樣。

+0

哎呀,逗號開始行傷我的眼睛TT – roselan

+0

呵呵我從來沒有真正想到這一點,我認爲它看起來不錯:) – John

回答

3

這個問題你子查詢找到的最後一個職位是沒有理由last_post_time,TOPIC_TITLE等來屬於具有MAX(last_post_time)行

想想這個查詢:

SELECT MAX(last_post_time), MIN(last_post_time), topic_title 
FROM forum_topics 
GROUP BY forum_id 

這返回哪個topic_title?那個排名最高的排名?排名最少的那一排?這是不明確的 - MySQL只能從組中任意選擇一個topic_title。在實踐中,它從在物理上首先存儲在該組中的行中進行選擇,並且這在你的控制之外,取決於存儲引擎實現等。

這是一個替代設計,它找到沒有其他forum_topics行的forum_topics行具有更大last_post_time存在:

SELECT root.name AS root_name 
    , subcat.name AS subcat_name 
    , subcat.id AS subcat_id 
    , subcat.description AS subcat_description 
    , subcat.safe_url AS subcat_safe_url 
    , topics.* 
FROM forum_category AS root 
LEFT JOIN forum_category AS subcat ON subcat.parent_id = root.id 
LEFT JOIN forum_topics AS topics ON topics.forum_id = subcat.id 
LEFT JOIN forum_topics AS t2 ON t2.forum_id = subcat.id 
    AND t2.last_post_time > topics.last_post_time 
WHERE root.parent_id = 0 AND t2.forum_id IS NULL 
ORDER BY root_name, subcat_name 
+0

嘿比爾 感謝您一個優秀的答案!我想我現在終於得到了......一整天都在用這個。我從來沒有真正想過如此做,但這是有道理的。 – John