mysql按唯一单词匹配量排序
我发现很多问题都需要大量的回答,但没有一个问题的回答和我想做的完全一样 动态生成的(准备好的语句)查询将产生如下结果:mysql按唯一单词匹配量排序,mysql,sql-order-by,Mysql,Sql Order By,我发现很多问题都需要大量的回答,但没有一个问题的回答和我想做的完全一样 动态生成的(准备好的语句)查询将产生如下结果: SELECT * FROM products WHERE ( title LIKE ? AND title LIKE ? ) AND ( content LIKE ? OR content LIKE ? ) AND ( subtitle LIKE ? AND author LIKE ? ) ORDER BY relevance LIMIT ?,? 输入的字数(以及类似于
SELECT * FROM products WHERE
( title LIKE ? AND title LIKE ? ) AND
( content LIKE ? OR content LIKE ? ) AND
( subtitle LIKE ? AND author LIKE ? )
ORDER BY relevance LIMIT ?,?
输入的字数(以及类似于的的字数)用于标题、内容和作者(取决于搜索查询)
现在我添加了一个按相关性排序的
。但我希望这个顺序是内容字段中匹配的唯一单词的数量。(注意:不取决于出现的数量,而是取决于在内容
列中至少有一个匹配项的输入字符串的数量)
示例表产品:
id | title | subtitle | content
------------------------------------
1 | animals | cat | swim swim swim swim swim swim swim
2 | canimal | fish | some content
3 | food | roasted | some content
4 | animal | cat | swim better better swims better something else
5 | animal | cat | dogs swim better
查询示例(填写准备好的语句):
预期结果(按正确顺序!):
我有一个Innodb表和低于5.6的mysql版本,因此我不能对
使用MATCH。
我想这可以用解决,当这个案例。。。然后
。但我不知道如何创建此排序。例如,您可以通过多种方式进行排序
ORDER BY SIGN(LOCATE('dog',content))+
SIGN(LOCATE('swim',content))+
SIGN(LOCATE('better',content)) DESC
还是用箱子
ORDER BY
CASE WHEN content LIKE '%dog%'
THEN 1
ELSE 0
END
+
CASE WHEN content LIKE '%swim%'
THEN 1
ELSE 0
END
+
CASE WHEN content LIKE '%better%'
THEN 1
ELSE 0
END
DESC
像这样检查
SELECT id,CONCAT_WS('-',COUNT(LENGTH(content) - LENGTH(REPLACE(content, ' ', '')) + 1),REPLACE(content,' ',',')) AS amount of matches FROM products
WHERE
( title LIKE %animal% ) AND
( content LIKE %dog% OR content LIKE %swim% OR content LIKE %better% ) AND
( subtitle LIKE %cat% )
GROUP BY id
ORDER BY id
性能方面有什么不同吗?如果我希望添加所有已找到行的计数(*)(用于分页),是否可能?这取决于。。。我认为第二种方法会更快。同样的结果是:我可能会使用第二种方法,因为符号已经附加到单词中,所以我不能使用第一种方法。我可以写的情况下,内容喜欢吗?(准备好的报表)?是否必须添加其他0?
ORDER BY
CASE WHEN content LIKE '%dog%'
THEN 1
ELSE 0
END
+
CASE WHEN content LIKE '%swim%'
THEN 1
ELSE 0
END
+
CASE WHEN content LIKE '%better%'
THEN 1
ELSE 0
END
DESC
SELECT id,CONCAT_WS('-',COUNT(LENGTH(content) - LENGTH(REPLACE(content, ' ', '')) + 1),REPLACE(content,' ',',')) AS amount of matches FROM products
WHERE
( title LIKE %animal% ) AND
( content LIKE %dog% OR content LIKE %swim% OR content LIKE %better% ) AND
( subtitle LIKE %cat% )
GROUP BY id
ORDER BY id