Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/253.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 多对多关系标记匹配?_Php_Mysql_Tags - Fatal编程技术网

Php 多对多关系标记匹配?

Php 多对多关系标记匹配?,php,mysql,tags,Php,Mysql,Tags,我有一个艺术网站。我现在需要展示相关的艺术作品。我有三张桌子: art_info : art_id, title art_tag_relationship : art_id, tag_id art_tags : tag_id, tag (in text) 我试图通过最相关的标签匹配来获得给定艺术品的相关艺术品 现在让我们假设我有5件带标签的艺术品 艺术1标签:红、蓝、绿、黄 艺术2标签:红色、橙色、紫色、黑色、黄色、蓝色 第3条标签:红色

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

art_info             : art_id, title  
art_tag_relationship : art_id, tag_id  
art_tags             : tag_id, tag (in text)
我试图通过最相关的标签匹配来获得给定艺术品的相关艺术品

现在让我们假设我有5件带标签的艺术品

艺术1标签:红、蓝、绿、黄 艺术2标签:红色、橙色、紫色、黑色、黄色、蓝色 第3条标签:红色 艺术4标签:蓝色、绿色 第5条标签:白色、棕色

所以现在我想把与艺术1最相关的艺术作品按最匹配到最不匹配的顺序排列。我希望得到这样的结果

第1条的相关技术:

最佳匹配=艺术2,因为它匹配3个标签 第二匹配=艺术4,因为它匹配2个标签 第三匹配=艺术3,因为它匹配1个标签 不要显示art 5,因为找不到匹配项。 我曾考虑在获得art1的标签后使用foreach语句,但这似乎效率低下

这是我用来获取art 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'
那么,一旦我有了art 1中的4个标签,我如何获得最相关标签最多的艺术

谢谢你的时间和大脑的使用


编辑:概念似乎是,通过art_tag_关系->art_标签获取art_1的标签,然后从art_tag_关系获取art_id,其中tag_id与art_tag_关系中找到的art_id 1标签相同。

假设您正在查看的艺术品是art_id=1000

未经测试

理论上,它将从你所看到的所有艺术标签开始。然后它将展开以匹配其他艺术作品的所有相关标签。然后它将根据生成的art_id对其进行分组,压缩到每个组中的记录数应等于匹配的标记数,然后根据这些标记进行排序


玩转这个概念,一旦你有了一个有效的查询,就更新你的帖子。

你可以根据另一个艺术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

使用这个概念。这意味着当一个成员提交一些标记时,我将运行一个foreach语句来分隔每个单词,检查它是否存在于标记中。如果存在,请使用现有的标记id在art_tags_关系表中进行链接,如果该单词不存在,请将其输入art_tags表中。此外,它似乎没有像我们预期的那样,找到标记,然后找到与之匹配的其他标记。它使其始终保持在art_id=1000。所以它只给我艺术id 1000的结果,不会给我展示任何其他艺术id的作品。绝对漂亮谢谢!!!!我以前从来没有见过这种机器在使用。我会详细了解这方面的情况。再次感谢@Darius的意思是不等于。嘿,johan,我有点太兴奋了,它似乎起作用了,但当我测试它时,发现它的计数与匹配标签完全不同。我搜索了一个有4个标签的art_id,它给了我9的相关性。我不明白在这一点上它算什么,因为具有最高相关性的艺术与我所比较的艺术没有共同的标签。有什么想法吗?我怀疑它所做的计数是有多少艺术照片使用了相同的标记,而不是有多少匹配。@Darius,编辑了查询以只计算不同的标记。
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