Порядок Mysql с использованием строки поиска

у меня есть запрос mysql, например:

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

Я хочу, чтобы мои результаты были упорядочены, начиная с ani, например. мои результаты должны быть такими: {anil,anirudha,rani, ...}, начиная с ani, а затем следуют другие символы.

Может ли кто-нибудь помочь мне в этом.


person jijo pidiyath    schedule 22.09.2011    source источник


Ответы (4)


Что-то типа

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

Должен помочь... (сортировать по положению подстроки во всей строке)

person Ezekiel Rage    schedule 22.09.2011
comment
это будет работать для строки, начинающейся с ani .. но если строка начинается с информации, то это не сработает - person jijo pidiyath; 22.09.2011
comment
Что ж, location вернет 0, 1, 2... для строк, начинающихся с "ani", ".ani", "..ani"... я вижу там закономерность... "infoani" должен вернуть 4? - person Ezekiel Rage; 22.09.2011
comment
Ага, замените «ани» на строку по вашему выбору, например. «информация», «что угодно» и т. д. - person Ezekiel Rage; 27.09.2011
comment
@EzekielRage, мне нравится твое решение. хотя кажется, что mysql-подобная функция и функция locate не работают одинаково для некоторых символов. например, поиск ā с ​​лайком будет найден (используя utf8_general_ci или utf_unicode_ci), но не будет найден путем локации. см. мой пост stackoverflow.com/q/21695687/1211174 EDIT 3 подходит для этого. есть идеи как побороть эту проблему? - person oak; 11.02.2014

Вы можете использовать союз для достижения этого:

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
person user949502    schedule 22.09.2011
comment
Что, если искомая строка zanzibar и у вас есть три строки, содержащие это слово: zanzibar, zanzibar tanzania и alamo zanzibar? Ваш запрос будет иметь следующие результаты: alamo zanzibar, zanzibar и zanzibar tanzania, что неверно. - person Bogdan Sahlean; 22.09.2011

Я не совсем уверен, что именно вы ищете. Если вы хотите просто упорядочить результаты этого запроса по имени:

select * from employee 
  where name like '%ani%'
order by name asc;
person John Kane    schedule 22.09.2011
comment
я занимаюсь сортировкой своих результатов на основе строки запроса, например, для запроса типа select * от сотрудника, где имя типа «%info%» .... результаты должны быть отсортированы как infosys, infobridge, информация оболочки ... - person jijo pidiyath; 22.09.2011
comment
Результаты этого запроса будут отсортированы по имени сотрудника и будут исключать сотрудников, не содержащих %ani%. Я немного смущен порядком в вашем комментарии. Нужно ли сортировать имя по возрастанию или по убыванию? Я думал, что информационный мост появится раньше, чем инфосис. - person John Kane; 22.09.2011

select  * from employee 
where name like '%'+'ani'+'%'
order by if(SUBSTRING(name, 1, length('ani'))= 'ani', 0,1), name

для сервера mssql замените if на case when
с предоставленным синтаксисом, легко заменить «ani» на любое значение, которое вы хотите

person Luis Siquot    schedule 22.09.2011