Подтвердить что ты не робот

Сначала заказывается по определенному значению поля

У меня есть таблица с тремя столбцами:

id | name | priority
--------------------
 1 | core  |   10
 2 | core  |   9
 3 | other |   8
 4 | board |   7
 5 | board |   6
 6 | core  |   4

Я хочу заказать набор результатов с помощью priority, но сначала те строки, которые имеют name=core, даже если имеют более низкий приоритет. Результат должен выглядеть следующим образом:

id | name | priority
--------------------
 6 | core  |   4
 2 | core  |   9
 1 | core  |   10
 5 | board |   6
 4 | board |   7
 3 | other |   8
4b9b3361

Ответ 1

Есть также функция MySQL FIELD.

Если вы хотите выполнить полную сортировку для всех возможных значений:

SELECT id, name, priority
FROM mytable
ORDER BY FIELD(name, "core", "board", "other")

Если вас волнует только то, что "ядро" стоит первым, а другие значения не имеют значения:

SELECT id, name, priority
FROM mytable
ORDER BY FIELD(name, "core") DESC

Если вы хотите сначала отсортировать по "ядру", а остальные поля - в обычном порядке:

SELECT id, name, priority
FROM mytable
ORDER BY FIELD(name, "core") DESC, priority

Здесь есть некоторые оговорки:

Во-первых, я уверен, что это только функция mysql - вопрос помечен как mysql, но вы никогда не знаете.

Во-вторых, обратите внимание на то, как работает FIELD(): он возвращает основанный на единичном индексе значения - в случае FIELD(priority, "core") он вернет 1, если "core" - это значение. Если значение поля отсутствует в списке, оно возвращает ноль. Вот почему DESC необходим, если вы не укажете все возможные значения.

Ответ 2

Как правило, вы можете делать

select * from your_table
order by case when name = 'core' then 1 else 2 end,
         priority 

Особенно в MySQL вы также можете делать

select * from your_table
order by name <> 'core',
         priority 

Так как результатом сравнения в MySQL является либо 0, либо 1, и вы можете сортировать по этому результату.

Ответ 3

Один из способов дать предпочтение конкретным строкам - добавить большое число в свой приоритет. Вы можете сделать это с помощью инструкции CASE:

  select id, name, priority
    from mytable
order by priority + CASE WHEN name='core' THEN 1000 ELSE 0 END desc

Демо: http://www.sqlfiddle.com/#!2/753ee/1

Ответ 4

Это работает для меня, используя Postgres 9 +:

SELECT *
FROM your_table
ORDER BY name = 'core' DESC, priority DESC

Ответ 5

Один из способов:

select id, name, priority from table a
order by case when name='core' then -1 else priority end asc, priority asc

Ответ 6

SELECT * FROM cars_new WHERE status = '1' and car_hide !='1' and cname IN ('Executive Car','Saloon','MPV+','MPV5') ORDER BY FIELD(cname, 'Executive Car', 'Saloon','MPV+','mpv5')

Ответ 7

сделайте следующее:

SELECT * FROM table ORDER BY column `name`+0 ASC

Добавление символа +0 означает, что:

0, 10, 11, 2, 3, 4

становится:

0, 2, 3, 4, 10, 11

Ответ 8

Используйте это:

SELECT * 
FROM tablename 
ORDER BY priority desc, FIELD(name, "core")