一般に、この種の多対多の関係には、次の3つのテーブルがあります。
- "
article
"テーブル
- "
tag
"テーブル
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行目だけを取得するだけです。