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


89

У мене є таблиця з 3 колонками:

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

Відповіді:


155

Також є функція MySQLFIELD .

Якщо потрібно повне сортування за всіма можливими значеннями:

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це необхідно, якщо ви не вказали всі можливі значення.


5
Приблизно через 5 років я змінив прийняту відповідь на цю, тому що вона чистіша і швидша.
Омід

db2 еквівалент?
Кібермонах,

Це спрацювало для мене, я хотів би задати ще одне запитання про те, як обробляти Якщо стовпець „пріоритет” містить такі значення, як напр .: „core core”, „new board” тощо. Тут стовпець, що не містить точного значення, чи можемо ми написати щось на зразок % ядро%?
Джаянт Суварна,

@JayanthSuvarna: дивлячись на документи MySQL FIELD (), я впевнений, що немає жодного способу оцінити це як підрядки, оскільки кожен аргумент повинен бути певним рядком. Можуть існувати деякі функції маніпулювання рядками, які можуть допомогти, але я не впевнений.
Nerdmaster

Дякую, друже. Ти мене вразив.
BEingprabhU

92

Як правило, ви можете це зробити

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і ви можете відсортувати за цим результатом.


1
що тут означає 1і 2означає?
Niraj Chauhan

1
У мене є близько 3000 рядків для сортування. У моєму випадку рішення @ Айман-Hourieh на stackoverflow.com/questions/958627 / ... займає половину часу по порівнянні з цим рішенням.
nightlyop

@nightlyop: Хороший. Тільки одна примітка: швидше рішення стосується MySQL.
juergen d

1і 2це лише 2 числа, які я використовую для сортування даних. Може бути 3і 4чи щось інше.
Юрген д.

А коли є %в WHEREреченні? Подобається . . . WHERE name LIKE '%sth%' . . .? stackoverflow.com/questions/41303379/…
стек

6

Одним із способів віддати перевагу певним рядкам є додавання великої кількості до їх пріоритету. Ви можете зробити це за допомогою 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



3

Один із способів такий:

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

1
Чи не втратить це порядок coreрядків?
mellamokb

1
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')

3
Хоча ваш код може бути відповіддю на запитання, краще надати деякі пояснення щодо нього.
Мехрабан,

0

зробити це:

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

Додавання +0 означатиме, що:

0, 10, 11, 2, 3, 4

стає:

0, 2, 3, 4, 10, 11

Цей прийом призначений для перетворення рядка в число. Він не стосується питання ОП. (Однак, не бачачи типу даних priority, я не можу сказати, чи має це бути частиною повного рішення.)
Рік Джеймс,

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.