【问题标题】:Order SQL by strongest LIKE?按最强 LIKE 排序 SQL?
【发布时间】:2026-02-05 08:20:07
【问题描述】:

我有以下疑问:

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

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

【问题讨论】:

  • “最相关”是指col_1 上的匹配比col_2 上的匹配具有更高的优先级,等等?
  • 什么是最相关的结果?
  • 您的意思是“过滤”而不是“排序”吗?
  • @Wiseguy 抱歉,我删除了我的评论。

标签: mysql sql database full-text-search


【解决方案1】:

如果你的意思是 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]

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

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

【讨论】:

  • 刚测试,不需要子查询,更新答案。
  • 不知道是不是只有我,但我不得不删除加号 ( + ) 和 括号后的 逗号( [ ] ) 来自 [priority] 以使代码正常工作。
【解决方案2】:

当你谈到“相关性”时,你真的想要自然语言搜索,这是 MySQL full-text searches 支持的。语法不同于普通的like查询,需要给表添加一个特殊的索引,但是这种方式可以按相关性排序。

以下是 MySQL 计算相关性的方式(来自链接):

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

create a full-text index on an existing table,使用FULLTEXT修饰符:

CREATE FULLTEXT INDEX index_name
ON table_name (col1, col2, col3)

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

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

【讨论】:

    【解决方案3】:

    你不能。您要求您的 RDBMS 按“LIKE”列匹配最多的行对结果进行降序排序。

    例如,MySQL 使用所谓的FULLTEXT 索引来执行此操作。

    【讨论】: