基于How to implement tagging system similar to SO in php/mysql?
我做了一些小改动,并实现了以下图像标记:SELECT I.imageId, GROUP_CONCAT(DISTINCT T.tagName SEPARATOR ' '), COUNT(*)
FROM Images I
INNER JOIN ImageTagMap M ON I.imageId = M.imageId
INNER JOIN ImageTags T ON T.tagId = M.tagId
WHERE T.tagName LIKE '%new%' OR T.tagName LIKE '%yo%'
GROUP BY I.imageId
ORDER BY COUNT(*) DESC
目前,这已经成功地获取了那些填充WHERE子句的所有图像的imageId,并根据点击次数最多(GROUP by子句生成的点击次数)对其进行排序。它还获取所有匹配的标记名并将它们粘在一个字符串中。很好。
我真正希望用户拥有相关图片的所有标记名。当前返回的标记名只是那些与LIKE语句匹配的标记名。例如,如果图片被标记为“2010纽约”,我搜索(如上所述)“纽约”,它将返回imageId“纽约”。但是我想要匹配图像的所有标签信息,我想要imageId,“纽约2010”。
一个简单的解决方案是将上面的查询粘贴到一个子查询中,然后使用imageId in的新WHERE子句(上面的查询作为子查询)重新运行连接。尽管这看起来很傻(即使乐观主义者可能会用它变魔术),但我肯定不需要重新运行两次完全相同的连接吗?还是我?
作为旁白,有没有更好的方法来搜索标签,而不是像我一样的一群人陷入?
最佳答案
SELECT
M.imageId,
GROUP_CONCAT(DISTINCT T2.tagName SEPARATOR ' ') AS tagNames,
COUNT(DISTINCT T.tagName) AS relevance
FROM ImageTagMap M
JOIN ImageTags T ON T.tagId=M.tagId
JOIN ImageTagMap M2 ON M2.imageId=M.imageId
JOIN ImageTags T2 ON T2.tagId=M2.tagId
WHERE T.tagName LIKE '%new%' or T.tagName LIKE '%yo%'
GROUP BY M.imageId
ORDER BY relevance DESC
必须重新加入两次。任何较短的方法都是受欢迎的。
关于mysql - mysql多对多标签实现+完整标签列表,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3716864/