Mysql 按匹配的标记数排序具有匹配标记的项目
我试图通过匹配标签的数量来确定如何订购具有匹配标签的商品 假设您有三个MySQL表:Mysql 按匹配的标记数排序具有匹配标记的项目,mysql,search,tags,sphinx,Mysql,Search,Tags,Sphinx,我试图通过匹配标签的数量来确定如何订购具有匹配标签的商品 假设您有三个MySQL表: tags(tag\u id,title) 文章(文章id,一些文本) articles\u标签(标签号,物品号) 现在假设您有四篇文章,其中: article_id=1有“幽默”、“有趣”和“搞笑”的标签 article_id=2有“滑稽”、“愚蠢”和“愚蠢”的标签 article\u id=3有“滑稽”、“愚蠢”和“愚蠢”的标签 article_id=4的标签是“完全严重” 您需要通过至少一个匹配标记查找
tags(tag\u id,title)
文章(文章id,一些文本)
articles\u标签(标签号,物品号)
article_id=1
有“幽默”、“有趣”和“搞笑”的标签
article_id=2
有“滑稽”、“愚蠢”和“愚蠢”的标签
article\u id=3
有“滑稽”、“愚蠢”和“愚蠢”的标签
article_id=4
的标签是“完全严重”
您需要通过至少一个匹配标记查找与article_id=2
相关的所有文章,并按最佳匹配顺序返回结果。换句话说,article\u id=3
应该排在第一位,而article\u id=1
排在第二位,而article\u id=4
应该根本不出现
这是SQL查询中可以实现的还是单独实现的,还是更适合Sphinx之类的查询?如果是前者,那么应该执行什么样的查询,以及应该为最高效的结果创建什么样的索引?如果是后者,请展开。尝试以下方法:
select article_id, count(tag_id) as common_tag_count
from articles_tags
group by tag_id
where tag_id in (
select tag_id from articles_tags where article_id = 2
) and article_id != 2
order by common_tag_count desc;
MySQL的语法可能需要一些调整
或者这一个确实有效:;-)
类似于:
SELECT a.*
FROM articles AS a
INNER JOIN articles_tags AS at ON a.id=at.article_id
INNER JOIN tags AS t ON at.tag_id = t.id
WHERE t.title = 'funny' OR t.title = 'goofy' OR t.title = 'silly' AND a.id != <article_id>
GROUP BY a.id
ORDER BY COUNT(a.id) DESC
选择一个*
以文章为例
a.id=at.article\u id上的内部联接项目\u标记
内部连接标记为t ON at.tag_id=t.id
其中t.title='funcy'或t.title='goofy'或t.title='silly'和a.id!=
按a.id分组
按计数排序(a.id)说明
仅使用常规索引,假设articles_tags具有PK of(article_id,tag_id)和标记索引。title第二种语法非常棒,完全符合我的需要。非常感谢!
SELECT a.*
FROM articles AS a
INNER JOIN articles_tags AS at ON a.id=at.article_id
INNER JOIN tags AS t ON at.tag_id = t.id
WHERE t.title = 'funny' OR t.title = 'goofy' OR t.title = 'silly' AND a.id != <article_id>
GROUP BY a.id
ORDER BY COUNT(a.id) DESC