2014-07-07 74 views
1

我想寫一個查詢來選擇我所有的論壇並獲得相應的最新帖子(包括作者)......但我失敗了。選擇所有論壇並獲取最新帖子..怎麼樣?

這是我的結構:

forums      forum_threads    forum_posts 
----------     -------------    ----------- 
id       id      id 
parent_forum (NULLABLE)  forum_id     content 
name      user_id     thread_id 
description     title      user_id 
icon      views      updated_at 
          created_at    created_at 
          updated_at 
          last_post_id (NULLABLE) 

這是我當前的查詢:

SELECT forum.id, forum.name, forum.description, forum.icon, post_user.username 
FROM forums AS "forum" 
LEFT JOIN forum_posts AS "post" ON post.thread_id = (
    SELECT id 
    FROM forum_threads 
    WHERE forum_id = forum.id 
    ORDER BY updated_at DESC LIMIT 1) 
LEFT JOIN users AS "post_user" ON post_user.id = post.user_id 
WHERE forum.parent_forum = 1 
GROUP BY forum.id 

當然這個查詢是不正確的,因爲有一個線程很多帖子...

任何人都可以幫忙嗎?我使用PostgreSQL btw。

哦:我忘了: 目前我運行所有「類別」(擁有parent_forum = NULL的論壇),然後爲每個論壇運行一個額外的查詢(這就是爲什麼您在我的查詢中看到parent_forum = 1的原因)。有沒有更好的方法來做到這一點?

編輯: 我的最後一個職位是在forum_posts

+0

我也不太瞭解' 「類別」'你的第二個問題。我建議爲此打開一個*新問題。每個問題的一個問題是它應該如何。你可以隨時引用這個上下文來保證一些多餘的輸入。 –

+0

我的意思是每個論壇都有一個「parent_forum」。如果「parent_forum」爲NULL,那麼它就是一個帶有subforums的類別。 – CryNickSystems

回答

1

後用的updated_at最新日期這就是你有什麼想法?您可以使用子查詢獲取給定論壇的最新帖子。

SELECT forums.id, forums.name, forums.description, forums.icon, 
    (SELECT username FROM forum_threads AS ft 
    JOIN forum_posts AS fp ON ft.id = fp.thread_id 
    JOIN users AS u ON fp.user_id = u.user_id 
    WHERE ft.forum_id = forums.id 
    ORDER BY updated_at DESC LIMIT 1) AS username_of_latest_post 
FROM forums 
+0

您的解決方案似乎很容易理解,但如果我想從子查詢中選擇多個列,該怎麼辦? – CryNickSystems

+0

這使得它更棘手。您可以嘗試在子查詢中使用行構造函數組合多個值,例如'SELECT ROW(username,user_id)...' – user2303197

2

DISTINCT ON應該使它更容易些:

SELECT DISTINCT ON (f.id) 
     f.id, f.name, f.description, f.icon, u.username 
FROM forums    f 
LEFT JOIN forum_threads t ON t.forum_id = f.id 
LEFT JOIN forum_posts p ON p.thread_id = t.id 
LEFT JOIN users   u ON u.id = p.user_id 
WHERE f.parent_forum = 1 
ORDER BY f_id, p.updated_at DESC; 

根據您的問與答更新最新帖子是一個與最新forum_posts.updated_at
假設列被定義爲NOT NULL

詳細說明:
Select first row in each GROUP BY group?

+0

查詢不起作用..當我運行它時(使用固定語法)我得到這個錯誤:「列」u.username「必須出現在GROUP BY子句中或在一個聚合函數中使用「..並與所有列PgSQL希望通過添加分組,它不工作(我得到」NULL「作爲用戶名的值) – CryNickSystems

+0

對不起 - 我更新了我的問題,所以最新的職位現在定義。 – CryNickSystems

+0

@CryNickSystems:抱歉,'GROUP BY'這一行是一個疏忽,現在被刪除。此查詢中沒有「GROUP BY」。 –

相關問題