Пользовательский порядок MYSQL с использованием функции FIELD и нескольких столбцов

У меня есть таблица с именем data, имеющая 2 столбца type и status следующим образом:

TYPE        STATUS

deposit     1
deposit     1
deposit     2
deposit     3
deposit     0
transfer    1
transfer    2
transfer    3
transfer    0
transfer    1

Мне нужно заказать его, имея порядок status как (1, 2, 3, затем 0), но когда status это 1, мне нужно deposit ввести, чтобы быть первым, затем transfer ввести, а для остальных статусов мне нужно только они должны быть (2, 3, затем 0), не обращая внимания на тип.

Я смог разгадать только половину головоломки, используя этот запрос:

select * from data order by FIELD(status, '1', '2', '3', '0')

Результат :

TYPE        STATUS

deposit     1
transfer    1
transfer    1
deposit     1
deposit     2
transfer    2
deposit     3
deposit     3
transfer    0
deposit     0

Необходимый результат:

TYPE        STATUS

deposit     1
deposit     1
transfer    1
transfer    1
deposit     2
transfer    2
deposit     3
deposit     3
transfer    0
deposit     0

Заранее спасибо!

3 метода стилизации элементов HTML
3 метода стилизации элементов HTML
Когда дело доходит до применения какого-либо стиля к нашему HTML, существует три подхода: встроенный, внутренний и внешний. Предпочтительным обычно...
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
0
0
108
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Разве вы не можете просто сделать:

select *
from data
order by field(status, '1', '2', '3', '0'), type

Вы имеете в виду select * from data order by FIELD(status, '1', '2', '3', '0'), type

Dwix 22.05.2019 15:01

Да, это одно из решений. Спасибо.

Dwix 22.05.2019 15:02
Ответ принят как подходящий

Если вы не хотите привязываться к выражению FIELD, которое вам придется обновлять, если количество значений статуса изменится, вы можете сначала упорядочить по STATUS > 0 DESC (что упорядочит все положительные значения STATUS перед значением 0), а затем по STATUS (чтобы упорядочить положительные значения как 1, 2, 3 и т. д.), затем на TYPE (поскольку deposit в алфавитном порядке предшествует transfer):

SELECT *
FROM data
ORDER BY STATUS > 0 DESC, STATUS, TYPE

Выход:

TYPE        STATUS    
deposit     1
deposit     1
transfer    1
transfer    1
deposit     2
transfer    2
deposit     3
deposit     3
transfer    0
deposit     0

Демо на dbfiddle

Другие вопросы по теме