多对多关系标签匹配?

时间:2011-08-29 04:41:59

标签: php mysql tags

我有一个艺术网站。我现在需要展示相关的艺术作品。我有3张桌子:

art_info             : art_id, title  
art_tag_relationship : art_id, tag_id  
art_tags             : tag_id, tag (in text)

我正在尝试通过最相关的标记匹配来获取给定艺术作品的相关艺术。

所以现在让我说我有5个带标签的艺术作品

art#1标签:红色,蓝色,绿色,黄色
art#2标签:红色,橙色,紫色,黑色,黄色,蓝色
art#3标签:红色
art#4标签:蓝色,绿色
art#5标签:white,brown

所以现在我希望将最相关的艺术作品以艺术品#1的顺序排列,以便最匹配到最不匹配。我希望得到像这样的结果

相关技术#1:

  • 最佳匹配=艺术#2(因为它匹配3个标签)
  • 第二场比赛=艺术#4(因为它匹配2个标签)
  • 第3场比赛=艺术#3(因为它匹配1个标签)
  • 不显示第5条艺术品,因为未找到匹配项。

一旦我获得艺术品#1的标签,我就会考虑使用foreach语句,但这似乎效率低下。

以下是我用于获取艺术品#1

标签的查询
SELECT art_info.art_id, art_info.title
FROM art_info
INNER JOIN art_tag_relationship ON art_info.art_id = art_tag_relationship.art_id
WHERE art_tag_relationship.art_id = '1'

所以现在,一旦我获得艺术品#1中的4个标签,我如何获得具有最相关标签的最多艺术品?

感谢您抽出时间和使用大脑。

编辑:概念似乎是,通过art_tag_relationship获取艺术#1的标签 - > art_tags,然后从art_tag_relationships获取art_id,其中tag_id与art_tag_relationships中art_id#1的找到标签相同。

2 个答案:

答案 0 :(得分:1)

您可以选择最相关的艺术作品,给定另一个art_id。

SELECT 
    ai.art_id, 
    ai.title
    count(DISTINCT r2.tag_id) as relevance
FROM art_tag_relationship r1 
INNER JOIN art_tag_relationship r2 ON (r1.tag_id = r2.tag_id 
                                   AND r1.art_id <> r2.art_id) 
INNER JOIN art_info ai ON (r2.art_id = ai.art_id) 
WHERE r1.art_id = '1'   -- this is the art_id results should be related to. 
GROUP BY ai.art_id
ORDER BY relevance DESC

答案 1 :(得分:0)

鉴于你所看到的艺术品是art_id = 1000

SELECT 
    art_info.art_id, 
    art_info.title
    count(*) as Cnt
FROM 
    art_tag_relationship A1, 
    art_tag_relationship A2,
    art_info 
WHERE 
    A1.art_id = 1000 
    AND
    A1.tag_id = A2.tag_id 
    AND
    A2.art_id = art_info.art_id
GROUP BY 
    art_info.art_id
ORDER BY 
    Cnt DESC

(未测试的)

理论上,它将从你正在看的所有艺术标签开始。然后它将展开以匹配其他艺术作品的所有相关标签。然后它将通过生成的art_id对此进行分组,并且浓缩到每个组中的记录数应该等于匹配的标记数,然后对其进行排序。

使用概念并在有可用查询后更新您的帖子。