我有一个艺术网站。我现在需要展示相关的艺术作品。我有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:
一旦我获得艺术品#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的找到标签相同。
答案 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对此进行分组,并且浓缩到每个组中的记录数应该等于匹配的标记数,然后对其进行排序。
使用概念并在有可用查询后更新您的帖子。