Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL按“订购”;“最佳匹配”;_Mysql_Sql_Sql Order By - Fatal编程技术网

MySQL按“订购”;“最佳匹配”;

MySQL按“订购”;“最佳匹配”;,mysql,sql,sql-order-by,Mysql,Sql,Sql Order By,我有一个包含单词的表和一个使用实时搜索来搜索该表的输入字段。目前,我使用以下查询来搜索表: SELECT word FROM words WHERE word LIKE '%searchstring%' ORDER BY word ASC 有没有一种方法可以对结果进行排序,以便在单词开头找到字符串的结果排在第一位,在单词后面出现字符串的结果排在最后 例如:搜索“hab”当前返回 alphabet habit rehab 但我喜欢这样: SELECT word FROM words WHER

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

SELECT word FROM words WHERE word LIKE '%searchstring%' ORDER BY word ASC
有没有一种方法可以对结果进行排序,以便在单词开头找到字符串的结果排在第一位,在单词后面出现字符串的结果排在最后

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

  • alphabet
  • habit
  • rehab
  • 但我喜欢这样:

    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
    
  • habit(首先是因为“hab”是开始)
  • Alp>强> Hab/<强> et(第二,因为“HAB”在单词的中间)
  • rehab(最后一个原因是“hab”在单词的末尾)
  • 或者至少是这样:

    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
    
  • habit(首先是因为“hab”是开始)
  • rehab(第二个原因是“hab”从第三个字母开始)
  • alphabet(最后一个原因是'hab'最晚开始,在第四个字母处)
  • 如果有人能帮我解决这个问题就太好了

    试着这样做:

    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
    
    第一个方法(开始单词,在单词中间,结尾单词),尝试这样的事情:

    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
    
    要使用第二种方法(匹配字符串的位置),请使用:

    例如,如果有多个单词以
    hab
    开头,您可能还需要一个平局打破者。为此,我建议:

    SELECT word
    FROM words
    WHERE word LIKE '%searchstring%'
    ORDER BY <whatever>, word
    
    选择单词
    言辞
    其中包含“%searchstring%”之类的单词
    按顺序
    

    如果有多个以
    hab
    开头的单词,则以
    hab
    开头的单词将按字母顺序分组和排序。

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

     ORDER BY INSTR(word,searchstring)
    
    当searchstring以两个不同的单词出现在同一位置时,要使resultset更具确定性,请通过以下方式向顺序中添加第二个表达式:

     ORDER BY INSTR(word,searchstring), word
    

    (例如,搜索字符串<代码> HAB <代码>出现在代码< CababiS和 Sababy >的第二个位置:

    我喜欢用“SkixStand”来选择开始和结束的单词的想法,只要按字母顺序排列那些“搜索字符串”就好了。然而,这并不完全正确。在大数据中需要花费太多的时间set@KrunalShah
    orderby
    减慢了泛型中的查询速度。我不知道这个答案中的CASE表达式将如何返回3。满足该条件的单词的任何值都将已经满足前一个条件,并且大小写表达式将返回2。。。也许检查的顺序应该不同?这是一个很好的答案,每个解决方案都有助于了解/学习。我建议在“searchstring”这样的词出现时添加另一个大小写
    ,然后添加0
    (没有
    %
    )单独捕获精确匹配的大小写。如果它与
    searchstring
    完全匹配,则如果使用
    ORDER BY,word
    的平分键,它应该自然排序到顶部。示例:搜索
    so
    返回sob、son、soap、socks、so、sop、sow。按大小写排序,当像“searchstring%”这样的词结束时为1,当像“%searchstring”这样的词结束时为3,否则为2,word将使精确匹配(
    so
    )位于顶部。这有意义吗?谢谢,@spencer7593你节省了我的时间,上帝保佑你