Сначала заказывается по определенному значению поля
У меня есть таблица с тремя столбцами:
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
Ответы
Ответ 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")