Упорядочение по определенному значению поля, как сначала - PullRequest
0 голосов
/ 26 сентября 2018

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

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

Пример:

Это таблица1

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

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

In "псевдокод", что-то похожее на:

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

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

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

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

Ответы [ 3 ]

0 голосов
/ 26 сентября 2018

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

SELECT DESCRIPTION 
FROM table1 
Where DESCRIPTION like 'Wo%' 
order by DESCRIPTION.
0 голосов
/ 26 сентября 2018

Мы можем использовать выражения в предложении 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.

0 голосов
/ 26 сентября 2018
  • Вы можете рассчитать рейтинг в предложении Select согласно вашим LIKE%% требованиям.Вы можете использовать If () function или Case When оператор.
  • В случае одиночных требований LIKE%%, If () может бытьиспользуется, иначе Случай, когда .
  • Теперь вы можете упорядочить результат по этому рейтингу.
  • Примечание: По ответу с помощью @ 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
...