Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.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
Mysql 按匹配的标记数排序具有匹配标记的项目_Mysql_Search_Tags_Sphinx - Fatal编程技术网

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的标签是“完全严重” 您需要通过至少一个匹配标记查找

我试图通过匹配标签的数量来确定如何订购具有匹配标签的商品

假设您有三个MySQL表:

  • 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