Создать пользовательский порядок SQL по правилам - PullRequest
1 голос
/ 16 февраля 2011

Я делаю базовую операцию выбора, получая столбец varchar в базе данных MySQL.Значения, хранящиеся в столбце, являются «номерами заданий», и все они имеют форму:

J ## - ####

Где первые два знака # указывают на последние две цифры номерагод выполнения задания, а последние четыре представляют порядок, в котором были созданы задания.

Вот пример того, как может выглядеть номер задания:

J11-0152 (152-йРабота создана в 2011 году).Следующим будет J11-0153 ...

Предполагая, что записи хранятся в случайном порядке, можно ли извлечь записи, отсортированные так, чтобы самые последние задания отображались первыми?

например.Записи в таблице хранятся в следующем порядке:

 1. J09-1893
 2. J11-1323
 3. J08-0011
 4. J09-0234
 5. J10-1232
 6. J11-1111

Будет получено как:

 1. J11-1323
 2. J11-1111
 3. J10-1232
 4. J09-1893
 5. J09-0234
 6. J08-0011

Я открыт для любого решения, которое может быть достигнуто в MySQL.Я использую CakePHP в качестве фреймворка приложения, поэтому, если кто-нибудь знает умное решение проблемы, которое тоже может сработать.

Ответы [ 4 ]

2 голосов
/ 16 февраля 2011

Двузначные даты и номера должностей должны по-прежнему корректно сортироваться, даже лексикографически.Но, если у вас были данные до 2000 года, то вам нужно это:

(пример таблицы включен - просто игнорируйте)

drop table if exists jobnumbers ;
create table jobnumbers (id int primary key, number varchar(10)); 
insert jobnumbers values
(  1, 'J09-1893'),
(  2, 'J11-1323'),
(  3, 'J08-0011'),
(  4, 'J09-0234'),
(  5, 'J10-1232'),
(  6, 'J11-1111'),
(  9, 'J99-1111');

select *
from jobnumbers
order by 
  case when number>'J5' then 1900 else 2000 end desc, number desc;

Что касается indexing (так как вы пометили его), два варианта:

  1. вам придется разбить его на несколько столбцов, чтобы можно было индексировать по году, затем номер задания
  2. Использовать 4-значные годы.
1 голос
/ 16 февраля 2011

Используйте SUBSTRING (), чтобы получить интересующую вас часть строки:

SELECT SUBSTRING(myFieldName, from, to) AS myFieldAlias ORDER BY myFieldAlias DESC

В вашем случае это должно быть:

SELECT SUBSTRING(job_number, 1, 3) as location, SUBSTRING(job_number, 5, 4) AS jobno ORDER BY location DESC, jobno DESC
1 голос
/ 16 февраля 2011

Сначала:

CREATE INDEX idx_table_jobnumber ON table (jobnumber);

Затем:

select jobnumber FROM table ORDER BY jobnumber DESC

«Ужасно ужасно» означает «медленно» для меня.

0 голосов
/ 16 февраля 2011

Попробуйте еще раз jobnumber DESC запрос или скажите, почему он не работает. Может быть, предоставить примерный вывод, который является неточным.

...