gpt4 book ai didi

mysql多对多标签实现+全标签列表

转载 作者:行者123 更新时间:2023-11-29 01:00:22 25 4
gpt4 key购买 nike

基于 How to implement tagging system similar to SO in php/mysql?

我做了一些小改动,并实现了以下图片标签:

SELECT I.imageId, GROUP_CONCAT(DISTINCT T.tagName SEPARATOR ' '), COUNT(*)<br/>
FROM Images I<br/>
INNER JOIN ImageTagMap M ON I.imageId = M.imageId<br/>
INNER JOIN ImageTags T ON T.tagId = M.tagId<br/>
WHERE T.tagName LIKE '%new%' OR T.tagName LIKE '%yo%'<br/>
GROUP BY I.imageId<br/>
ORDER BY COUNT(*) DESC

目前,这成功地获取了所有满足 WHERE 子句的图像的 imageId,并根据最多的命中率(没有由 GROUP BY 子句生成的命中率)对它们进行排序。它还获取所有匹配的标签名称并将它们粘贴在一个字符串中。不错。

我真正希望用户拥有相关图片的所有标签名称。目前返回的 tagNames 只是那些与 LIKE 语句匹配的。例如如果一张图片被标记为“2010 new york”并且我搜索(如上所述)“new yo”,它将返回 imageId,“new york”。但我想要匹配图像的所有标签信息,我想要 imageId,“new york 2010”。

一个简单的解决方案是将上述查询粘贴到一个子查询中,然后使用 imageId IN 的新 WHERE 子句重新运行连接(上面的查询作为子查询)。虽然这看起来很愚蠢(即使优化器可能会用它做魔术),但我肯定不需要重新运行完全相同的连接两次吗?或者我呢?

顺便说一句,有没有比我陷入的一堆 LIKE 更好的搜索标签的方法?

最佳答案

SELECT<br/>
M.imageId,<br/>
GROUP_CONCAT(DISTINCT T2.tagName SEPARATOR ' ') AS tagNames,<br/>
COUNT(DISTINCT T.tagName) AS relevance<br/>
FROM ImageTagMap M<br/>
JOIN ImageTags T ON T.tagId=M.tagId<br/>
JOIN ImageTagMap M2 ON M2.imageId=M.imageId<br/>
JOIN ImageTags T2 ON T2.tagId=M2.tagId<br/>
WHERE T.tagName LIKE '%new%' or T.tagName LIKE '%yo%'<br/>
GROUP BY M.imageId<br/>
ORDER BY relevance DESC

不得不重新加入两次。欢迎任何更短的方式。

关于mysql多对多标签实现+全标签列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3716864/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com