一般來說,對於這種類型的許多一對多的關係,有三個表:
- 的 「
article
」 表
- 的「
tag
「表
- A 「
tags_articles
」 表,其作爲一個連接表,並且只包含:
id_article
:指向文章的外鍵
id_tag
:指向標籤的外鍵
這樣,沒有任何標籤數據的重複:每個標籤,有一個且只有一個,在tag
錶行。
而且,對於每篇文章,您可以有幾個標籤(即tags_articles
表中的幾行);當然,對於每個標籤,你可以有幾篇文章。
獲取的標籤列表的一篇文章,有這樣的想法,是一種其它附加查詢的問題,如:
select tag.*
from tag
inner join tags_articles on tag.id = tags_articles.id_tag
where tags_articles.id_article = 123
獲得了三個「最相似」的文章將意味着:
- 選擇標籤上有第一篇文章的文章
- 只使用那些具有最重要的相同標籤數
沒有測試,但一個想法可能是東西,應該是這樣的:
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
cl因爲那篇文章會有兩行
- 當然,你不想重新選擇你已有的文章 - 這意味着它必須被排除。
- 但是,當您使用
group by article.id
,會有每篇文章
- 只有一條線,但你可以使用
count
,找出每一篇文章多少標籤具有共同與初始一個
- 然後,它只是按每個標籤數排序,只獲得第三個三行。
是的,但你沒有回答我的主要問題,如何得到3個最相似的文章? – mfolnovich 2010-04-08 19:56:42
@mfolnovich:我已經編輯了幾次我的答案,以添加更多關於設計的信息;然後,看到你的評論,我重新編輯,以添加一個可能的解決方案的想法,以獲得3最相似的文章。 – 2010-04-08 20:07:56