Упорядочивание по определенному значению поля, сначала LIKE

Я знаю функцию ORDER BY FIELD(fieldname, value1, value2, ..., valueN).

Как я мог упорядочить свои результаты не по определенным значениям, а по «похожим» значениям, если таковые имеются?

Пример:

Это таблица1

--------------------
| ID | DESCRIPTION |
--------------------
| 1  | Hello       |    
| 2  | World       |
--------------------

Хотелось бы заказать по DESCRIPTION like 'Wo%', чем остальные

В «псевдокоде» что-то похожее на:

SELECT DESCRIPTION 
FROM table1 
ORDER BY FIELD(DESCRIPTION, 'Wo%') DESC 

Ожидаемый результат:

----------------
|  DESCRIPTION |
----------------
|  World       |    
|  Hello       |
----------------

Этот код не работает, поскольку ожидается, что value1, ..., valueN будет точным значением поля.

Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
0
0
30
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

  • Вы можете рассчитать рейтинг в пункте Select в соответствии с вашими требованиями к LIKE%%. Вы можете использовать функцию Если() или инструкцию Случай Когда.
  • В случае одиночных требований LIKE%% может использоваться Если(), иначе Случай Когда.
  • Теперь вы можете отсортировать результат по этому рейтингу.
  • Примечание:Как ответил от @ spencer7593, вы можете сделать то же самое CASE WHEN в самом предложении ORDER BY вместо того, чтобы сначала вычислять их явно в предложении Select.

Попробуйте следующее:

SELECT DESCRIPTION, IF(DESCRIPTION LIKE '%Wo%', 1, 99999) AS Rank  
FROM table1 
ORDER BY Rank ASC

В случае нескольких условий LIKE%% вы можете использовать следующее:

SELECT DESCRIPTION, 
       CASE 
         WHEN DESCRIPTION LIKE '%Wo%' THEN 1 
         WHEN DESCRIPTION LIKE '%He%' THEN 2 
         ELSE 99999
       END AS Rank  
FROM table1 
ORDER BY Rank ASC

Мы можем упорядочить по выражению, которого нет в списке SELECT, т.е. нет необходимости возвращать производный столбец с именем rank в наборе результатов. Мы можем просто поместить выражение в предложение ORDER BY. Для тестирования, да, мы можем захотеть включить выражение в список SELECT, чтобы мы могли «видеть» в результатах, что выражение оценивает.

spencer7593 26.09.2018 23:38

@ spencer7593 Я знаю это, но обычно мне нравится видеть результаты выражений, по которым я заказываю. С точки зрения MySQL, я не думаю, что есть разница в производительности. Он должен сначала вычислить значение выражения в любом случае, а затем выполнить сортировку. Только забираемый пакет данных будет немного больше. Пожалуйста, поправьте меня, если я ошибаюсь

Madhur Bhaiya 27.09.2018 05:01

нет ты не ошибся. Просто представленный ответ, похоже, подразумевает, что его можно упорядочить только по выражениям, которые находятся в списке SELECT; не указывает на то, что выражение CASE могло быть в предложении ORDER BY. (Это может быть очевидно для вас и для меня, но я не уверен, что OP понимает это из этого ответа. Мой комментарий был бы излишним, если бы в этом ответе был приведен пример выражения только в ORDER BY без производного столбца в SELECT список.)

spencer7593 27.09.2018 21:38

И я согласен с вами насчет выражений в списке SELECT. Я часто делаю это, чтобы проверить выражения, которые будут включены в предложение WHERE или ORDER BY. Намного проще тестировать и проверять оценку выражений, когда они находятся в списке SELECT, мы можем проверить возвращаемые результаты.

spencer7593 27.09.2018 21:44

@ spencer7593 спасибо. Я обновил ответ, чтобы также сослаться на ваш ответ - на случай, если кто-то хочет сделать это непосредственно в пункте Порядок по.

Madhur Bhaiya 27.09.2018 21:47

Попробуйте как

SELECT DESCRIPTION 
FROM table1 
Where DESCRIPTION like 'Wo%' 
order by DESCRIPTION.

Это не даст ожидаемого результата. Проверить OP

Cid 26.09.2018 17:34
Ответ принят как подходящий

Мы можем использовать выражения в предложении ORDER BY, например:

 SELECT t.description
   FROM table1 t
  ORDER
     BY t.description LIKE 'Wo%' DESC 
      , t.description

Выражение t.description LIKE 'Wo%' будет оцениваться как 0, 1 или NULL. Таким образом, значения NULL для description будут отсортированы последними, значения, удовлетворяющие условию, будут отсортированы первыми (потому что мы указали DESC для сортировки по убыванию.

Более портативный, более совместимый со стандартами ANSI эквивалент будет:

 SELECT t.description
   FROM table1 t
  ORDER
     BY CASE WHEN t.description LIKE 'Wo%' THEN 1 
             WHEN t.description NOT LIKE 'Wo%' THEN 0 
        END DESC
      , t.description

Если бы мы могли опустить этот второй WHEN и просто использовать ELSE 0, это дало бы нам немного иное поведение с NULL-значениями descrption.

Если нам не нравится голое выражение «foo LIKE bar» в предложении ORDER BY, мы могли бы обернуть его функцией MySQL, чтобы сделать его более понятным для будущего читателя,

 SELECT t.description
   FROM table1 t
  ORDER
     BY IF(t.description LIKE 'Wo%',1,0) DESC
      , t.description

Опять же, ключевым моментом здесь является то, что мы можем использовать выражения в предложении ORDER BY. Для тестирования мы можем включить то же выражение в список SELECT, чтобы мы могли «видеть» (в возвращаемых результатах), что эти выражения оценивают. Но обратите внимание, что нет требования, чтобы выражения в ORDER BY появлялись в списке SELECT.

Другие вопросы по теме