MySQL命令"最佳匹配"

eev*_*vaa 36 mysql sql sql-order-by

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

SELECT word FROM words WHERE word LIKE '%searchstring%' ORDER BY word ASC
Run Code Online (Sandbox Code Playgroud)

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

例如:搜索' hab '当前返回

  1. 一个 lphabet
  2. ^ h升技
  3. r ehab

但我喜欢这样:

  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'开始最新,在第四个字母)

如果有人能帮我解决这个问题会很棒!

Ed *_*bbs 76

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

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
Run Code Online (Sandbox Code Playgroud)

要以第二种方式(匹配字符串的位置)执行此操作,请使用以下LOCATE函数:

SELECT word
FROM words
WHERE word LIKE '%searchstring%'
ORDER BY LOCATE('searchstring', word)
Run Code Online (Sandbox Code Playgroud)

您可能还需要一个打破平局,例如,一个以上的单词开头hab.为此,我建议:

SELECT word
FROM words
WHERE word LIKE '%searchstring%'
ORDER BY <whatever>, word
Run Code Online (Sandbox Code Playgroud)

在以多个单词开头的情况下,以...开头hab的单词hab将被分组在一起并按字母顺序排序.

  • 我建议添加另一个案例“WHEN word like 'searchstring' THEN 0”(不带“%”)来单独捕获完全匹配的情况。 (2认同)

Rob*_*ert 15

试试这种方式:

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
Run Code Online (Sandbox Code Playgroud)

  • 我不明白这个答案中显示的 CASE 表达式如何返回 3。满足该条件的任何单词值都已经满足了前面的条件,并且 CASE 表达式将返回 2 ...也许检查应该在不同的顺序? (2认同)

spe*_*593 8

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

 ORDER BY INSTR(word,searchstring)
Run Code Online (Sandbox Code Playgroud)

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

 ORDER BY INSTR(word,searchstring), word
Run Code Online (Sandbox Code Playgroud)

(例如,搜索字符串hab出现在两个的第二位置chablisshabby)