我有一个包含单词和输入字段的表,可以使用实时搜索来搜索该表。目前,我使用以下查询来搜索表:
SELECT word FROM words WHERE word LIKE '%searchstring%' ORDER BY word ASC
有没有办法对结果进行排序,以便在单词的开头找到字符串的那些字符串首先出现,而字符串出现在字母表后面的字符串最后会出现?
示例:搜索“ hab ”目前返回
但我喜欢这样:
或至少这样:
如果有人能帮我解决这个问题会很棒!
答案 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
出现在chablis
和shabby
的第二个位置