私のデータベースには、記事名と記事タグのある記事のテーブルがあります。記事タグは、「人、人生、大統領」のようなタグが含まれる文字列列です。すべての記事はこの方法でタグ付けされます。
今、私は記事の全人口のために10の最も人気のあるタグを取得したいと思います。これを行う方法?
可能性がある場合は、データベーススキーマを変更して、articleテーブル、tagテーブル、およびarticle_tagsテーブルを作成することをお勧めします。
これにより、特に記事が多い場合に、タグのマッチングがはるかに効率的になります(実行したいタグなど)。
現在の設計では、(おそらく大きな)記事テーブルを完全に反復処理し、タグのヒープを維持することに固執しています(一時テーブルを介して-この場合はストアドプロシージャを介して実行できます-またはアプリケーションコードで) )。全体は本当に非効率的です。
データベースを正規化し、別のタグテーブルを作成すると、はるかに簡単になります。たとえば、次のようなデータベースがある場合:
article
article_id
article_title
article_content
article_tag
tag_name
article_id
UNIQUE INDEX (tag_name, article_id)
UNIQUE INDEX (article_id, tag_name) # in order to perform fast lookups in both directions
(これは、とtag
を含む-tableを作成し、 inに置き換えることで、さらに正規化できる可能性があります。)tag_name
tag_id
tag_name
tag_id
article_tag
これで、次のようなクエリを使用して、最も人気のあるタグのリストを表示できます。
SELECT tag_name, count(article_id) c
FROM article_tag
GROUP BY tag_name
ORDER BY c DESC
LIMIT 10