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 将名字插入到tag表中并抓取ID插入到PT表中。两者都与POST表插入中生成的postid一起。
最后,我有一个名为 PTVIEW 的视图,其架构如下:

SELECT *
FROM dbo.PT

PT_PostID = dbo.Post.POST_ID 上
加入标签
在 PT_TagID = tag.TAG_ID 上加入标签

这是 select * from PTVIEW 的示例结果
在此处输入图像描述


问题是我无法查看独特的帖子及其标签。
我正在使用 MSSQL,所以我没有在 mySQL 中内置 Group_concat 函数。

我无法构建将显示每篇文章及其相关标签的初始页面,就像 stackoverflow 在主页上所做的那样。我在 PTVIEW 中做错了什么?

4

2 回答 2

2

你基本上有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

尽管第二个选项看起来有点漂亮,但第一个选项有我个人的偏好。我认为第二个不太可读,并且在较大的数据集上性能不会很好。

于 2013-06-20T03:44:50.877 回答
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
于 2013-06-20T15:04:48.437 回答