我有一个表,其中包含单词和一个输入字段,可以使用实时搜索来搜索该表。目前,我使用以下查询来搜索表:
SELECT word FROM words WHERE word LIKE '%searchstring%' ORDER BY word ASC
有没有办法对结果进行排序,以便在单词开头找到字符串的结果在前,在单词后面出现字符串的结果在最后?
示例:搜索“hab”当前返回
- 一个字母表
- h升技
- r ehab
但我喜欢这样:
- hab它(首先因为'hab'是开始)
- alp hab et(第二个因为'hab'在单词的中间)
- re hab(最后是因为 'hab' 在词尾)
或者至少是这样:
- hab它(首先因为'hab'是开始)
- re hab(第二个,因为“hab”从第三个字母开始)
- 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/