我正在构建典型的帖子和标签应用,其中帖子可以有多个标签。我坚持设置数据库架构。我到目前为止:
发布:
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
当用户提交帖子时,我将表单数据插入到post表中。下一步,我遍历用户提供的标记名,看看它们是否在TAG_TAGNAME字段中。如果匹配,请获取ID并将其插入PT表。 ELSE将名称插入到标记表中并获取ID并将其插入到PT表中。两者都与POST表插入中生成的postid一起。
最后,我有一个名为PTVIEW的视图,其中包含以下模式:
SELECT *
来自dbo.PT
加入帖子
ON PT_PostID = dbo.Post.POST_ID
加入标签
ON PT_TagID = tag.TAG_ID
以下是来自PTVIEW
的select *的示例结果
问题是我无法查看唯一帖子及其标签。
我正在使用MSSQL,因此我没有在mySQL中内置Group_concat函数。
我无法构建初始页面,该页面将显示每个帖子及其相关标签,例如主页上的stackoverflow。我在PTVIEW中做错了什么?
答案 0 :(得分: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
即使第二个选项看起来有点漂亮,第一个选项也有我的个人偏好。 我认为第二个不太可读,性能在较大的数据集上不会很好。
答案 1 :(得分: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