56

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

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

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

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

  1. 一个字母表
  2. 习惯_
  3. 康复_

但我喜欢这样:

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

或者至少这样:

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

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

4

4 回答 4

104

要做到这一点(开始单词,在单词中间,结束单词),尝试这样的事情:

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函数

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将被组合在一起并按字母顺序排序。

于 2013-09-10T18:15:04.293 回答
25

试试这个方法:

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
于 2013-09-10T18:06:08.273 回答
11

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

 ORDER BY INSTR(word,searchstring)

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

 ORDER BY INSTR(word,searchstring), word

(例如,searchstringhab出现在chablis和的第二个位置shabby

于 2013-09-10T18:20:14.837 回答
0

在您的情况下,它将是:

ORDER BY INSTR(word, '%searchstring%')

INSTRword列中搜索'%searchstring%'并返回它的位置,如果没有匹配,那么它将0导致结果按顺序下降。

您还可以添加 DESC 来改变方向,例如:

ORDER BY INSTR(word, '%searchstring%') DESC
于 2021-12-27T08:17:50.360 回答