MySQL. Использование оператора LIKE в секции ORDER BY

Мало кому известно, что оператор like можно использовать в секции order by, задавая, тем самым, дополнительные условия сортировки. Честно признаться, я был крайне удивлен когда, чисто случайно, попробывав такую конструкцию обнаружил, что она работает и, надо сказать, работает очень не плохо. Позднее я обратился к книге по языку MySQL, к которой постоянно обращаюсь, когда ищу какую-нибудь редко используемую фукцию или конструкцию MySQL. Эта книга у меня всегда вызывает уважение и является авторитетот, поскольку не раз выручала в сложных ситуациях. На мое удивление, конструкции, случайно мною обнаруженной, в этой книге я не нашел, по этому решил, что мало кто о ней знает. Эта причина явилась стимулом в написании данной статьи. Итак, начнем. Секция ORDER BY служит для задания условий сортировки результирующего запроса. Так, если вам нужно отсортировать результаты выборки из какой-нибудь таблицы, скажем по имени, необходимо написать следующее:

ORDER BY `name` [asc|desc]

Если Вы имеете, к примеру таблицу, в которой хранится информация о ваших друзьях (имя, фамилия, телефон, адрес), то, полностью, запрос для выборки отсортированный по полю "имя" будет выглядеть так:

SELECT * FROM TableName ORDER BY `name` - по-возрастанию 
SELECT * FROM TableName ORDER BY `name` desc- по-убыванию, 

где TableName - имя таблицы, `name` - имя поля содержащее имена друзей.
Это довольно простые запросы и все кто только начал знакомится с MySQL быстро их усвоят, по-этому, идем дальше! Отсортировать результаты по какому то полю не составляет труда, но что делать, если я имею таблицу товаров и хочу отсортировать результаты выборки по полю "наименование товара" да еще и так, чтобы, например, карандаши шли первыми? В таком случае мне опять поможет оператор ORDER BY но уже в таком виде:

SELECT * FROM TableName ORDER BY `good_name`='карандаши' desc или в таком:  
SELECT * FROM TableName ORDER BY if(`good_name`='карандаши',1,0) desc

где TableName - имя нашей таблицы, `good_name ` - имя поля содержащее наименования товаров.
Обратите внимание, что в секции ORBER BY условие должно возвратить булевое значение и, если поле `goods`='карандаши' - то условие срабатывает (первый пример). Второй пример делает то же самое за исключением способа написания условия. А теперь нам рукой подать и к рассмотрению оператора LIKE в секции ORDER BY. Не будем останавливаться. Итак, допустим Вам нужно выбрать запросом данные из таблицы товаров таким образом, чтобы результирующий запрос был отсортирован по названию товаров но первыми выводились товары с названием "карандаш", после них должны идти товары в названии которых содержиться слово "карандаш", то есть сюда попадут также товары с названием, например "карандаш твердый" или "карандаш мягкий". Такую выборку можно сделать используя оператор Like в секции ORDER BY.

SELECT * FROM TableName ORDER BY good_name like 'карандаш' desc, good_name like '%карандаш%' desc;

где TableName - имя таблицы, `good_name` - имя поля содержащее наименования товаров.
Как видно из примера я использовал "...good_name like..." два раза. Для чего это было сделано? Правильно! Для того чтобы сначало в результат запроса попали те товары наименование которых полностью совпадает со словом "карандаш", а после них шли товары в наименовании которых слово карандаш лишь встречается. Это видно из вида оператора LIKE в первом случае он обозначен как like 'карандаш', а во втором как like '% карандаш%' - с использованием спецсимвола '%' - который говорит, что перед словом "карандаш" и после него могут следовать любые символы.


Клименко Владимир, специально для RuBlin.org Have fun!

Tags: 

7 коментарів

by Виталий on Втр, 02/28/2012 - 12:53

Полезная статья. Пригодиться.  

by Евгений on Ндл, 09/30/2012 - 10:06

Спасибо

by Oleg on Сбт, 08/10/2013 - 12:05

Посоветуйте команду которой можно поменять значения полей в одной таблице MySQL в зависимости от значения полей в другой таблице.akyl91@mail.ru

by rublin on Пн, 08/19/2013 - 09:54

К сожалению, не могу подсказать. Я с MySQL не особо работаю )

by Костя on Срд, 01/15/2014 - 12:24

Спасибо, единственное при укозании like надо добавлять %searched_word%, иначе сортирует криво

by slave919 on Ндл, 11/02/2014 - 15:02

Спасибо!!!!!!!!! то что нужно!!! Сортировка по релевантности оператором likeставлю like 

by Vovka on Ндл, 04/05/2015 - 11:11

Есть мнение, что выражение

SELECT * FROM TableName ORDER BY `good_name`='карандаши' desc

не отсортирует по полю good_name, а просто все строки в которых `good_name`='карандаши'
поднимет вверх таблицы, а все остальные строки останутся в перемешку по данному полю...

поправьте, если я не прав?

    

Post new comment

Filtered HTML

  • Адреси сторінок і електронної пошти атоматично перетворюються у посилання.
  • Дозволені теги HTML: <a> <em> <strong> <cite> <blockquote> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Рядки та параграфи відокремлюються автоматично.

Plain text

  • HTML теґи не відображаються
  • Рядки та параграфи відокремлюються автоматично.
By submitting this form, you accept the Mollom privacy policy.
© rublin.org, 2009 - 2015 Буду вдячний за зворотнє посилання, при використанні матеріалів сайту. Powered by Rublin Team.