2013-06-20 29 views
0

我正在構建一個帖子可以有多個標籤的典型帖子和標籤應用程序。我堅持設置數據庫模式。我至今:具有多個標籤的帖子的數據庫模式

帖子:
POST_ID PRIMARY KEY
POST_TITLE
POST_BODY
POST_DATE
POST_USERID

標籤:
TAG_ID PRIMARY KEY
TAG_TAGNAME


PT:
PT_ID
PT_POSTID
PT_TAGID


當用戶提交一則訊息,我插入表單數據進入後表。下一步我循環瀏覽用戶提供的標記名,看看它們是否在TAG_TAGNAME字段中。如果有匹配,請抓住ID並將其插入PT表格中。 ELSE將名稱插入到標記表中,並獲取該標識並將其插入到PT表中。兩者都與POST表插入中生成的postid一起使用。
最後,我有一個名爲PTVIEW視圖與下面的模式:

SELECT *
FROM dbo.PT
JOIN後
ON PT_PostID = dbo.Post.POST_ID
JOIN標籤
ON PT_TagID = tag.TAG_ID

下面是select * from PTVIEW的示例結果
enter image description here


問題是我無法獲得獨特帖子及其標籤的視圖。
我正在使用MSSQL,所以我沒有內置到mySQL中的Group_concat函數。

我無法構建初始頁面,該頁面將顯示每個帖子及其相關標籤,如在主頁上使用的stackoverflow。我在PTVIEW中做了什麼錯誤?

回答

2

你基本上有兩個選擇:

  1. 其分解成2個不同的查詢,得到一個訊息,然後得到它的 相關標籤。
  2. 使用如下語句 這種拼接標記爲單場:
SELECT DISTINCT 
     P.Post_ID , 
     SUBSTRING((SELECT ',' + T.TAG_TAGNAME AS [text()] 
        FROM dbo.PT PT 
          INNER JOIN dbo.Tag T ON PT.PT_TAGID = T.TAG_ID 
        WHERE P.POST_ID = PT.POST_ID 
        FOR 
        XML PATH('') 
       ), 2, 1000) [Tags] 
FROM dbo.Post P 

即使第二個選項看起來有點俏皮,第一個選項有我個人的喜好。 我認爲第二個不太可讀,在較大的數據集上性能不會很好。

+0

如果我用的是第一選擇,我能想到的列出職位及標籤的頂部#的唯一方法是使用一個嵌套循環。抓取每個postID,然後選擇另一個來獲取標記名。我錯了嗎?我覺得如果有很多帖子,這也會成爲服務器上的負載。 – jwimmer

1

這是我學會如何做到的。

SELECT * 
    ,(
     SELECT TAG_TAGNAME+ ', ' 
     from PT 
     JOIN Tag ON PT_TagID = TAG_ID 
     Where PT_PostID = POST_ID 
     ORDER BY TAG_TAGNAME 
     FOR XML PATH('') 
    ) AS Tags 
    FROM Post 
相關問題