2011-12-23 11 views
2

少なくともタグ「Tag1」と「Tag2」を持つすべての記事を効率的に選択する必要があります。 これは、次のデータベーススキーマとスタンダールの方法です:MySQLで一連のタグを持つすべての記事を効率的に取得する

articles(id, title) 
article_tag(articleid, tagid) 
tag(id, name) 

SELECT a.* 
FROM article a 
    INNER JOIN (SELECT at.articleid 
       FROM  article_tag at 
         INNER JOIN article a 
          ON a.id = at.articleid 
         INNER JOIN tag t 
          ON t.id = at.tagid 
       WHERE t.name IN ("Tag1","Tag2") 
       GROUP BY at.articleid 
       HAVING Count(at.articleid) = 2) aa 
    ON a.id = aa.articleid 

は、より効率的な方法のパフォーマンスが賢明ではありませんか?

+0

タグの最大数に制限はありますか? –

+0

いいえ、最大制限はありませんが、最小値は2つのタグ – evodevo

+0

サブクエリのアーティクルテーブルを使用した結合を削除できます。 – DavidEG

答えて

3

私はこのクエリは、(あなたの条件に合わせて)速いと期待:

SELECT a.* 
FROM (
    SELECT at.articleid AS id 
    FROM article_tag at 
    JOIN tag t ON t.id = at.tagid 
    WHERE t.name = 'Tag1' 
    ) a1 
JOIN (
    SELECT at.articleid AS id 
    FROM article_tag at 
    JOIN tag t ON t.id = at.tagid 
    WHERE t.name = 'Tag2' 
    ) a2 USING (id) 
JOIN article a USING (id); 

しかし、ここで最も重要な部分はインデックスです。主キーは、(私は仮定)が自動的にインデックス付けされます(ID)に

  • 記事(情報でarticleID、TAGID)に
  • article_tag - (ID)に複数列インデックス
  • タグ
また

これらは、あなたのケースを助ける:

  • タグ(名前)
  • 芸術上icle_tag on(tagid)

これは、の特殊ケースです。です。ここにはextensive coverage of your case exactlyがあります。あなたはそこにどれだけ良い方法があるのか​​驚くでしょう。

関連する問題