2

少なくともタグ「Tag1」と「Tag2」を持つすべての記事を効率的に選択する方法が必要です。これは、次のデータベース スキーマの標準的な方法です。

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

パフォーマンスに関してより効率的な方法はありますか?

4

1 に答える 1

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);

ただし、ここで最も重要な部分はindexです。主キーは自動的に索引付けされます (私は推測します):

  • (id) の記事
  • article_tag on (articleid, tagid) -- マルチカラム インデックス
  • タグ (id)

さらに、これらはあなたのケースに役立ちます:

  • (名前) にタグを付ける
  • article_tag on (tagid)

これは関係分割の特殊なケースです。これはまさにあなたのケースの広範な報道です。たくさんの良い方法があることに驚くでしょう。

于 2011-12-23T22:00:01.713 に答える