mysql SORT BY唯一字匹配的数量

Pep*_*epe 6 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 ?,?
Run Code Online (Sandbox Code Playgroud)

输入的单词数量(以及其数量LIKE)是标题,内容和作者的可变数量(取决于搜索查询).

现在我添加了一个ORDER BY relevance.但是我希望这个顺序是匹配的内容字段中的唯一单词数量.(注意:不是关于外观的数量,而是关于content列中输入的字符串中至少有一个匹配的数量).

示例表products:

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
Run Code Online (Sandbox Code Playgroud)

示例查询(填写预编译语句):

SELECT * FROM products WHERE 
( title LIKE %animal% ) AND 
( content LIKE %dog% OR content LIKE %swim% OR content LIKE %better% ) AND 
( subtitle LIKE %cat% )
ORDER BY relevance LIMIT 0,10
Run Code Online (Sandbox Code Playgroud)

预期结果(按正确顺序排列!):

id      | amount of matches
-----------------
5       | 3 (dog, swim, better)
4       | 2 (swim, better)
1       | 1 (swim)
Run Code Online (Sandbox Code Playgroud)

我有一个Innodb表和低于5.6的mysql版本,因此我无法使用MATCH...AGAINST.我以为这可以解决WHEN CASE ... THEN.但我不知道如何创建这种排序.

val*_*lex 1

您可以通过多种方式做到这一点,例如

ORDER BY SIGN(LOCATE('dog',content))+
         SIGN(LOCATE('swim',content))+
         SIGN(LOCATE('better',content)) DESC
Run Code Online (Sandbox Code Playgroud)

SQLFiddle 演示

或与案例

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
Run Code Online (Sandbox Code Playgroud)