以最强的LIKE命令SQL?

Sha*_*zam 21 mysql sql database full-text-search

我有以下查询:

SELECT * FROM table_name
WHERE (col_1 LIKE '%$keyword%'
    OR col_2 LIKE '%$keyword%'
    OR col_3 LIKE '%$keyword%')
  AND .... <some optional filters> ... 
Run Code Online (Sandbox Code Playgroud)

是否有基于最相关结果进行排序的策略?

Dom*_*let 33

如果你的意思是col_1比col_2更相关,依此类推:

select *
      ,case when col_1 like '%$keyword%' then 1
            when col_2 like '%$keyword%' then 2
            when col_3 like '%$keyword%' then 3
       end as [priority]
  from table_name
 where col_1 like '%$keyword%'
    or col_2 like '%$keyword%'
    or col_3 like '%$keyword%'
 order by [priority]
Run Code Online (Sandbox Code Playgroud)

如果您的意思是列匹配最多,那么:

select *
      ,(case when col_1 like '%$keyword%' then 1 else 0 end) +
      ,(case when col_2 like '%$keyword%' then 1 else 0 end) +
      ,(case when col_3 like '%$keyword%' then 1 else 0 end) as [priority]
  from table_name
 where col_1 like '%$keyword%'
    or col_2 like '%$keyword%'
    or col_3 like '%$keyword%'
 order by [priority] desc
Run Code Online (Sandbox Code Playgroud)

  • 不知道它是否仅仅是我,但是我必须从[[priority]`**中的加号(_ + _)**和**括号(_ [] _)之后删除**逗号上班. (4认同)

McG*_*gle 30

当你谈到"相关性"时,你真的想要自然语言搜索,这是MySQL 全文搜索支持的.语法是比正常的不同一样的查询,你需要一个特殊的索引添加到表中,但相关性排序是有可能这样.

以下是MySQL如何计算相关性(来自链接):

当在WHERE子句中使用MATCH()时,如前面所示的示例,返回的行将首先自动排序,具有最高相关性.相关性值是非负浮点数.零相关意味着没有相似性.相关性是根据行中的单词数,该行中唯一单词的数量,集合中的单词总数以及包含特定单词的文档(行)数计算的.

在现有表上创建全文索引,请使用FULLTEXT修饰符:

CREATE FULLTEXT INDEX index_name
ON table_name (col1, col2, col3)
Run Code Online (Sandbox Code Playgroud)

然后,您可以执行这样的查询,以按相关性顺序检索结果:

SELECT * FROM table_name
WHERE MATCH (col1,col2,col3)
AGAINST ('keyword' IN NATURAL LANGUAGE MODE);
Run Code Online (Sandbox Code Playgroud)