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

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

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

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

  1. a lphabet
  2. h阿比特
  3. r埃哈布

但我希望这样:

  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"最晚开始,在第四个字母处)

如果有人能帮我解决这个问题就太好了!

推荐答案

第一种方式(开始单词,在单词中间,结束单词),试着这样做:

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相关问答推荐

MySQL:统计单词在单元格中出现的次数,并将数字放在bra中单词的旁边

Laravel DB::Transaction()

在时间戳上搜索大的MySQL表很慢

MySQL-如何检测时间戳中的一天

如何通过SQL来计算到达特定值的行的数量

外部磁盘上的MySQL表空间和数据文件

如何在 mysql 中获取 Day Wise 的平均值?

分别针对每个不同的列 Select 聚合

如何在 mysql 的 group by 子句中 Select 最后创建的记录?

MySQL DISTINCT 日期仅返回特定表的 1 个值.相同的查询适用于其他表

组平SQL查询结果

如何解决这个特定的 SQL 查询?我的解决方案还返回不想要的值

SQL从具有相同列的行中 Select 最后一行

查询以从约会表中获取可用空档

从 SQL 中的左连接和内连接中减go 计数

我将如何构建一个 SQL 查询来从交易表中 Select 第一次存款、第二次存款和额外存款

如何在sql中挑出某些名称

如何在 MySQL 的日期时间字段中存储 NULL 值?

表被指定了两次,既作为更新的目标,又作为 mysql 中数据的单独源

数据截断:第 1 行的logo列数据太长