2011-12-15 9 views
0

標準の正規化された多対多タグシステム(articles、tags、tag_mapの3つのテーブル)を考えてみましょう。関連記事を含むタグのリストを取得したい。たとえば、正規化されたデータベースでtag_mapを結合する方法

Tag Article_IDs 
tag1 1,5,7 
tag2 3,4,5,7,8 
..... 

このリストを生成するにはどうすればいいですか?

単純に、tag_map WHERE tag = 'something'の行数を数える単純な方法です。ひどく、この方法では、すべてのタグに対して個別のクエリが必要です。たとえば、20個のタグのリストを生成するには、20個のクエリが必要です(これは合理的ではありません)。これを行うには、JOINという1つのクエリが必要です。

答えて

2

あなたはgroup_concat集計関数でこれをacomplishすることができます。彼らはstackoverflowのサンプルの多くです。私は逃した

SELECT tag.id, 
GROUP_CONCAT(post.post_id) 
FROM 
    posts 
    inner join 
    post_tag on ... 
    inner join 
    tags on ... 
GROUP BY tag.id; 
+0

非常に微妙なポイント! – Googlebot

1

このような何かが動作するはずです(これは唯一、私は他のデータベース上のwm_concat()と同等のものを知らないOracleの場合):

select t.tagname, wm_concat(m.articleid) from tags t, tag_map m where t.id = m.tagid group by t.tagname; 
1
Select t.Tag, Group_Concat(a.Article_ID) 
From tag_map tm 
Join tag t on tm.tag_id = t.tag_id 
Join articles a on tm.article_id = a.article_id 
Group By t.Tag 
関連する問題