2011-02-28 49 views
0

我有一個線程,帖子和用戶的討論板。這個多表連接應該如何完成?

  • 用戶的表
  • 線程表
  • 職位表屬於線程
  • 查找表哪些線程用戶想要閱讀
  • 查找表列出了給定用戶在給定線程中讀取的編號最高的帖子。

所以現在我需要創建一個聯接,以便對於給定的用戶,我可以得到一個未讀帖子的線程表。

如何創建正確的連接?用戶,文章和線程都具有當然的主鍵ID,它被記錄在查找表,即

TABLE `posts_read` 
user | has_read_post | of_thread 
--------------------------------- 
5  | 100   | 3 

TABLE `subscribed_to` 
user | reads_thread 
--------------------- 
5  | 3 

:用戶5訂閱到線3,並且已經閱讀了帖子3的100後,但是帖子3現在有200帖子,用戶想要開始閱讀帖子101處的帖子3,因爲她的帖子落後了100個。

我可以一步到位嗎?當然,她可能會訂閱不止一個線程,所以我們應該根據哪一個最未讀。

+1

請發佈您迄今爲止編寫的代碼。人們通常不喜歡只爲你寫代碼。事實上,這是一個工作描述,而不是一個問題。 – 2011-02-28 05:13:58

+0

我到目前爲止編寫的代碼是'SELECT',接着是我搔着頭,試着想下一步該做什麼。 – AmbroseChapel 2011-02-28 05:59:17

+0

這還不夠,你必須先寫過sql查詢。不要試圖解決你頭腦中的問題,開始寫下解決方案。 – markus 2011-02-28 06:32:34

回答

1

這是一個可能的解決方法。我假設posts_read.has_read_post等於讀取的帖子數量,而不是在所有線程中唯一標識帖子的數字。如果它是一個獨特的帖子標識符,那麼事情就更難了。

首先創建一個返回兩列的查詢。列是用戶訂閱的每個線程的線程號。第二列是該線程中的帖子數量。

這應該是一個相當容易的設計查詢。我假設查詢返回名爲'thread'和'posts'的列。

現在我們創建一個基於包含每個這樣的線程的未讀消息的新查詢。我假設我們對用戶編號5感興趣。您需要將您已經寫入的查詢替換爲OtherQuery(但保留括號)。

SELECT other.thread, (other.posts - COALESCE(posts_read.has_read_post,0)) 
AS UnreadCount FROM (OtherQuery) other LEFT OUTER JOIN 
posts_read ON posts_read.of_thread = other.thread AND posts_read.user=5 

現在你可能要一個

WHERE UnreadCount > 0
添加到查詢得到的只有與未讀帖子的主題。你也想要一個ORDERBY,但你應該沒有問題添加。

編輯: 修改查詢,使得假設後標識符是嚴格遞增的:

SELECT other.thread, (SELECT count(*) FROM posts WHERE 
    posts.Thread = subscribed_to.thread 
    AND posts.ID > COALESCE(posts_read.has_read_post,0) 
    AND Post.Deleted=0) AS UnreadCount 
FROM subscribed_to LEFT OUTER JOIN 
    posts_read ON posts_read.of_thread = subscribed_to.thread AND 
    posts_read.user=subscribed_to.user 
WHERE subscribed_to.user=5 

這個新查詢通過與螺紋計數不刪帖的數量計數未讀的帖子帖子ID大於用戶已閱讀的最高帖子ID。顯然,我對帖子表的命名方式以及它的結構做了一些猜測,但不應該很難調整它來匹配包含帖子的表格。

+0

嗨,非常感謝!很多人想到那裏。我真的從來沒有聽說過「合併」(在MySQL中)!但它是一個獨特的帖子ID,不是多個帖子,因爲帖子可以被刪除,所以計數將在稍後關閉。無論如何,這給了我很多繼續,再次感謝。 – AmbroseChapel 2011-02-28 23:20:25

+0

@AmbroseChapel:我已經根據你所說的以及關於你的發佈表的樣子猜測了一下。如果您在執行此操作時遇到問題,請告訴我,我很樂意提供幫助。 – 2011-03-01 04:31:11

相關問題