8

サイトに記事があり、各記事を説明するタグを追加したいのですが、タグ用の mysql テーブルの設計に問題があります。私には2つのアイデアがあります:

  1. 各記事には「タグ」フィールドがあり、タグの形式は「タグ 1、タグ 2、タグ 3」です。
  2. フィールドを持つタグと呼ばれる他のテーブルを作成します: tag_name、article_id

したがって、ID 1 の記事のタグが必要な場合は、次のように実行します。

SELECT ... FROM tags WHERE `article_id`=1;

しかし、タグを比較して最も類似した 3 つの記事も知りたいので、"php,mysql,erlang" というタグを持つ記事と、"php,mysql"、"erlang,ruby" というタグを持つ記事が 5 つある場合、 「php erlang」、「mysql、erlang、javascript」の場合、1.、3.、および 4. を選択します。これら 3 つは、メインの記事とほとんど同じタグを持っているからです。

また別の質問ですが、「最も使用されたタグ」を 10 個取得する最善の方法は何ですか?

4

3 に答える 3

18

一般に、この種の多対多の関係には、次の3つのテーブルがあります。

  • " article"テーブル
    • 主キー=id
  • " tag"テーブル
    • 主キー=id
    • 各タグのデータが含まれています:
      • 名前、例えば
  • tags_articles結合テーブルとして機能し、以下のみを含む " "テーブル
    • id_article:記事を指す外部キー
    • id_tag:タグを指す外部キー


このように、タグのデータが重複することはありません。タグごとに、tagテーブルには1行だけがあります。

また、記事ごとに、複数のタグ(つまり、tags_articlesテーブル内の複数の行)を含めることができます。もちろん、タグごとに複数の記事を含めることができます。

このアイデアで記事のタグのリストを取得することは、次のような追加のクエリの問題です。

select tag.*
from tag
    inner join tags_articles on tag.id = tags_articles.id_tag
where tags_articles.id_article = 123


3つの「最も類似した」記事を取得することは、次のことを意味します。

  • 最初の記事にあるタグを持つ記事を選択します
  • 最も重要な数の同一のタグを持つもののみを使用してください

テストされていませんが、アイデアは次のようになります。

select article.id, count(*) as nb_identical_tags
from article
    inner join tags_articles on tags_articles.id_article = article.id
    inner join tag on tag.id = tags_articles.id_tag
where tag.name in ('php', 'mysql', 'erlang')
      and article.id <> 123
group by article.id
order by count(*) desc
limit 3

基本的に、あなた:

  • 最初の記事にある各タグの記事IDを選択します
    • 内部結合があるため、DB内の記事に句に一致する2つのタグがあり、where句がないgroup by場合、その記事には2行あります。
    • もちろん、すでに持っている記事を再選択する必要はありません。つまり、除外する必要があります。
  • ただし、を使用するgroup by article.idと、記事ごとに1行だけになります
    • countただし、を使用して、各記事に最初の記事と共通するタグの数を確認することができます。
  • 次に、タグの数ごとに並べ替えて、3行目だけを取得するだけです。
于 2010-04-08T19:55:41.397 に答える
1

まず、テーブルの設計に関する Pascal MARTIN の提案を使用する必要があります。

同様の記事を見つけることに関しては、ここから始めましょう。@article_id が一致を見つけたい記事であり、@tag1、@tag2、@tag3 がその記事のタグであるとします。

SELECT article_id, count(*)
FROM tags_articles
WHERE article_id <> @article_id
AND tag_id IN (@tag1, @tag2, @tag3)
GROUP BY article_id
ORDER BY count(*) DESC
LIMIT 3
于 2010-04-08T20:03:11.727 に答える
0

はい、でもあなたは私の主な質問に答えていませんでした.3つの最も類似した記事を取得するにはどうすればよいですか?

回答: マージされたテーブル (tags_articles) で同じタグ ID を探してください。それらを集めてパターンを作ります。

例: 記事 1 のタグ: 1,2 記事 2 のタグ: 2,3,4 記事 5 のタグ: 6,7,2 記事 7 のタグ: 7,1,2,3

記事 1 に最も類似した 3 つの記事が必要な場合は、タグ 1、2 を探す必要があります。第 7 条が最も類似しており、第 2 条と第 5 条にはいくつかの類似点があることがわかります。

于 2010-04-08T20:07:45.107 に答える