【问题标题】:Mysql order by using search stringMysql 使用搜索字符串排序
【发布时间】:2011-11-22 19:36:06
【问题描述】:

我有一个 mysql 查询,例如:

select * from employee 
  where name like '%ani%'

我希望我的结果以 ani 开头 例如。我的结果应该是: {anil,anirudha,rani, ...} 先以 ani 开头,然后是其他字符。

谁能帮帮我。

【问题讨论】:

    标签: mysql string sql-like sql-order-by


    【解决方案1】:

    类似

    select * from employee where name like '%ani%' order by locate('ani', name) asc, name asc
    

    应该做的伎俩...(按子字符串在整个字符串中的位置排序)

    【讨论】:

    • 它适用于以 ani .. 开头的字符串,但如果字符串以 info 开头,则它不会起作用
    • 嗯,对于以 'ani'、'.ani'、'..ani' 开头的字符串,该位置将返回 0、1、2 ......我在那里看到了一个模式...... . 'infoani' 应该返回 4 吗?
    • 啊哈,用您选择的字符串替换“ani”,例如“信息”、“随便什么”等……
    • @EzekielRage 我喜欢你的解决方案。虽然似乎 mysql 之类的函数和定位函数在某些字符上的工作方式不同。例如用 like 搜索 ā 会找到(使用 utf8_general_ciutf_unicode_ci),但不会通过定位找到。请参阅我的帖子stackoverflow.com/q/21695687/1211174 EDIT 3 与此相关。任何想法如何克服这个问题?
    【解决方案2】:

    您可以使用联合来实现此目的:

    select * from employee where name like 'ani%' order by name
    union 
    select * from employee where name like '%ani%' and not name like 'ani%' order by name
    

    【讨论】:

    • 如果搜索到的字符串是 zanzibar 并且您有三个包含该单词的字符串:zanzibarzanzibar tanzaniaalamo zanzibar 怎么办?您的查询将得到以下结果:alamo zanzibarzanzibarzanzibar tanzania,这是错误的。
    【解决方案3】:

    我不完全确定您在寻找什么。如果您只想按名称对该查询的结果进行排序:

    select * from employee 
      where name like '%ani%'
    order by name asc;
    

    【讨论】:

    • 我很喜欢根据查询字符串对我的结果进行排序,例如对于 select * from employee where name like '%info%' .... 结果应该排序为 infosys、infobridge、外壳信息 ...
    • 此查询的结果将按员工姓名排序,并将排除不包含 %ani% 的员工。我对您评论中的排序感到有些困惑。名称是否需要按升序或降序排序?我在想 infobridge 会在 infosys 之前出现
    【解决方案4】:
    select  * from employee 
    where name like '%'+'ani'+'%'
    order by if(SUBSTRING(name, 1, length('ani'))= 'ani', 0,1), name
    

    对于 mssql 服务器,将 if 替换为 case when
    使用提供的语法,很容易将 'ani' 替换为您想要的任何值

    【讨论】:

      猜你喜欢
      • 2023-04-02
      • 1970-01-01
      • 1970-01-01
      • 2016-12-20
      • 1970-01-01
      • 2013-01-12
      • 1970-01-01
      • 2013-09-13
      • 1970-01-01
      相关资源
      最近更新 更多