MySQL命令“最佳匹配”

时间:2013-09-10 18:03:37

标签: mysql sql sql-order-by

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

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

有没有办法对结果进行排序,以便在单词的开头找到字符串的那些字符串首先出现,而字符串出现在字母表后面的字符串最后会出现?

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

  1. a lphabet
  2. h abit
  3. r ehab
  4. 但我喜欢这样:

    1. hab 它(首先是因为'hab'是开头)
    2. alp hab et(第二个因为'hab'在单词的中间)
    3. 重新 hab (最后因为'hab'在这个词的末尾)
    4. 或至少这样:

      1. hab 它(首先是因为'hab'是开头)
      2. 重新 hab (第二个因为'hab'从第三个字母开始)
      3. alp hab et(最后因为'hab'在第四个字母开始最新)
      4. 如果有人能帮我解决这个问题会很棒!

3 个答案:

答案 0 :(得分:66)

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

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开头的单词将组合在一起并按字母顺序排序。

答案 1 :(得分:13)

尝试这种方式:

SELECT word 
FROM words 
WHERE word LIKE '%searchstring%' 
ORDER BY CASE WHEN word = 'searchstring' THEN 0  
              WHEN word LIKE 'searchstring%' THEN 1  
              WHEN word LIKE '%searchstring%' THEN 2  
              WHEN word LIKE '%searchstring' THEN 3  
              ELSE 4
         END, word ASC

答案 2 :(得分:7)

您可以使用INSTR函数返回单词中搜索字符串的起始位置,

 ORDER BY INSTR(word,searchstring)

当搜索字符串出现在两个不同单词的相同位置时,为了使结果集更具确定性,请向ORDER BY添加第二个表达式:

 ORDER BY INSTR(word,searchstring), word

(例如,searchstring hab出现在chablisshabby的第二个位置