MySQL 按 "best match"排序

标签 mysql sql sql-order-by

我有一个表,其中包含单词和一个输入字段,可以使用实时搜索来搜索该表。目前,我使用以下查询来搜索表:

SELECT word FROM words WHERE word LIKE '%searchstring%' ORDER BY word ASC

有没有办法对结果进行排序,以便在单词开头找到字符串的结果在前,在单词后面出现字符串的结果在最后?

示例:搜索“hab”当前返回

  1. 一个字母表
  2. h升技
  3. r ehab

但我喜欢这样:

  1. hab它(首先因为'hab'是开始)
  2. alp hab et(第二个因为'hab'在单词的中间)
  3. re hab(最后是因为 'hab' 在词尾)

或者至少是这样:

  1. hab它(首先因为'hab'是开始)
  2. re hab(第二个,因为“hab”从第三个字母开始)
  3. alp hab et(最后因为'hab'开始最晚,在第四个字母)

如果有人能帮我解决这个问题,那就太好了!

最佳答案

要做第一种方法(开始单词,在单词中间,结束单词),试试这样的:

SELECT word
FROM words
WHERE word LIKE '%searchstring%'
ORDER BY
  CASE
    WHEN word LIKE 'searchstring%' THEN 1
    WHEN word LIKE '%searchstring' THEN 3
    ELSE 2
  END

第二种方式(匹配字符串的位置),使用LOCATE function :

SELECT word
FROM words
WHERE word LIKE '%searchstring%'
ORDER BY LOCATE('searchstring', word)

如果有多个单词以 hab 开头,您可能还需要一个决胜局。为此,我建议:

SELECT word
FROM words
WHERE word LIKE '%searchstring%'
ORDER BY <whatever>, word

如果有多个以hab开头的单词,则以hab开头的单词会被组合在一起,按字母顺序排序。

关于MySQL 按 "best match"排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18725941/

相关文章:

MYSQL SUM() 与 GROUP BY 和 LIMIT

C# 按 2 列对表进行排序

mysql - SQL Varchar 命令

php - 如何计算当前日期与另一个日期的差值是否等于或减去天数

mysql - 将数据从一个表 move 到另一个表

mysql - "Plugin ' 0 ' is not loaded"

sql - 如何在多对多查询的一侧找到最小公分母

mysql - 计算过去四个完整周的每周平均值

mysql - 使用 SQL 和 JOIN 统计投票(这可能吗?)

sql - 记录 SSIS 变量表达式