Сортировка столбцов Alpanumeri c и Numeri c в mysql - PullRequest
1 голос
/ 09 марта 2020

Вот мои данные таблицы:

 - file_number -   status
 - ABC099    -     running
 - ABC100    -     running
 - ABC101    -     removed
 - ...
 - ABC1001   -     removed
 - ABC1002   -     removed
 - ABC1003   -     running
 - BCA099    -     running
 - BCA100   -      removed
 - BCA101   -      running
 - ...
 - BCA1001   -     removed
 - BCA1002   -     running
 - BCA1003   -     running

Этот запрос возвращает правильный ответ с отсортированным file_number:

SELECT file_number,status FROM table ORDER BY LENGTH(file_number) asc

Но я хочу также отсортировать столбец состояния, т.е. все запущенные файлы должны стоять на первом месте, а удаленные файлы должны отображаться в конце.

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

 - file_number  -  status
 - ABC099    -     running
 - ABC100    -     running
 - ABC1003   -     running
 - ...
 - BCA099    -     running
 - BCA101   -      running
 - ...
 - BCA1002   -     running
 - BCA1003   -     running
 - ABC101    -     removed
 - ABC1001   -     removed
 - ABC1002   -     removed
 - BCA100   -      removed 
 - BCA1001   -     removed

Ответы [ 2 ]

1 голос
/ 09 марта 2020

Вы должны попробовать

SELECT file_number,status
FROM `table` 
ORDER BY status desc,
     LENGTH(file_number) asc,
     file_number asc

Сначала вы должны заказать по статусу, затем вы должны заказать по длине. Не заказывайте сначала по длине.

0 голосов
/ 09 марта 2020

Вы можете разыграть file_number как signed, чтобы сделать заказ по номеру c. А затем добавьте status desc деталь в предложение ORDER BY, чтобы обеспечить желаемый алфавитный порядок, если у вас есть только две опции для столбца состояния:

SELECT file_number,status
  FROM `table` 
 ORDER BY status DESC, CAST(file_number AS signed)

Демо

Обновление: Если у вас также есть разные буквенные комбинации для префикса номеров файлов и вы хотите упорядочить их по порядку, подумайте о добавлении этого столбца в список ORDER BY в качестве первого компонента:

SELECT file_number,status
  FROM `table` 
 ORDER BY status DESC, file_number, CAST(file_number AS signed)

Демо 2

...