Я знаю функцию 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 будет точным значением поля.






Select в соответствии с вашими требованиями к LIKE%%. Вы можете использовать функцию Если() или инструкцию Случай Когда.LIKE%% может использоваться Если(), иначе Случай Когда.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
@ spencer7593 Я знаю это, но обычно мне нравится видеть результаты выражений, по которым я заказываю. С точки зрения MySQL, я не думаю, что есть разница в производительности. Он должен сначала вычислить значение выражения в любом случае, а затем выполнить сортировку. Только забираемый пакет данных будет немного больше. Пожалуйста, поправьте меня, если я ошибаюсь
нет ты не ошибся. Просто представленный ответ, похоже, подразумевает, что его можно упорядочить только по выражениям, которые находятся в списке SELECT; не указывает на то, что выражение CASE могло быть в предложении ORDER BY. (Это может быть очевидно для вас и для меня, но я не уверен, что OP понимает это из этого ответа. Мой комментарий был бы излишним, если бы в этом ответе был приведен пример выражения только в ORDER BY без производного столбца в SELECT список.)
И я согласен с вами насчет выражений в списке SELECT. Я часто делаю это, чтобы проверить выражения, которые будут включены в предложение WHERE или ORDER BY. Намного проще тестировать и проверять оценку выражений, когда они находятся в списке SELECT, мы можем проверить возвращаемые результаты.
@ spencer7593 спасибо. Я обновил ответ, чтобы также сослаться на ваш ответ - на случай, если кто-то хочет сделать это непосредственно в пункте Порядок по.
Попробуйте как
SELECT DESCRIPTION
FROM table1
Where DESCRIPTION like 'Wo%'
order by DESCRIPTION.
Это не даст ожидаемого результата. Проверить OP
Мы можем использовать выражения в предложении 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.
Мы можем упорядочить по выражению, которого нет в списке SELECT, т.е. нет необходимости возвращать производный столбец с именем rank в наборе результатов. Мы можем просто поместить выражение в предложение
ORDER BY. Для тестирования, да, мы можем захотеть включить выражение в список SELECT, чтобы мы могли «видеть» в результатах, что выражение оценивает.