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 タグ テーブルに名前を挿入し、ID を取得して PT テーブルに挿入します。両方とも、POST テーブル挿入で生成されたポスト ID と一緒です。
最後に、次のスキーマを持つ PTVIEW というビューがあります。

SELECT *
FROM dbo.PT
JOIN Post
ON PT_PostID = dbo.Post.POST_ID
JOIN Tag
ON PT_TagID = tag.TAG_ID

select * from PTVIEW のサンプル結果を次に示します。
ここに画像の説明を入力


問題は、独自の投稿とそのタグを表示できないことです。
MSSQL を使用しているため、mySQL に Group_concat 関数が組み込まれていません。

ホームページでstackoverflowが行うように、各投稿とそれに関連するタグを表示する最初のページを作成できません。PTVIEW で何が間違っていますか?

4

2 に答える 2

2

基本的に 2 つのオプションがあります。

  1. 2 つの異なるクエリに分割し、投稿を取得してから、関連するタグを取得します。
  2. 次のようなステートメントを使用して、タグを 1 つのフィールドに連結します。
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

2 番目のオプションはちょっと気の利いたように見えますが、最初のオプションは私の個人的な好みです。2番目はあまり読みにくく、大規模なデータセットではパフォーマンスがあまり良くないと思います.

于 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 に答える