2011-02-16 6 views
1

MySQL 데이터베이스에서 varchar 열을 검색하는 기본 선택 작업을 수행하고 있습니다. 컬럼에 저장된 값은 "작업 번호는"이며, 모든 양식이 있습니다규칙으로 사용자 지정 SQL 순서 만들기

J ## - ####

처음 두 개의 # 기호는 작업을했다 연도의 마지막 두 자리를 표시 작업 공간이 작성된 순서를 나타냅니다.

J11-0152 (2011 년에 만들어진 152 일) :

다음은 작업 번호의 모양에 대한 예제입니다. 다음은 J11-0153이 될 것입니다 ...

레코드가 임의의 순서로 저장된다고 가정하면 가장 최근의 작업이 먼저 표시되도록 레코드를 검색 할 수 있습니까?

예컨대 테이블의 레코드는이 순서에 저장됩니다 내가 MySQL의에서 수행 할 수있는 솔루션 열려있어

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

:로

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

이 검색 될 것이다. CakePHP를 앱 프레임 워크로 사용하고 있습니다. 문제가있는 사람이 똑똑한 케이크 솔루션을 알고 있다면 제대로 작동 할 것입니다.

+0

'직장 번호 ORDER BY 직장 번호 DESC'가 끔찍하게 실패합니다. – Adam

+0

어떻게 실패합니까? – awm

+0

코드가 의미하는 경우 별도의 필드에 parat를 저장하는 것이 더 좋습니다 - 스키마를 변경할 수 있습니까 – Mark

답변

2

2 자리 날짜와 작업 번호는 사전 식으로조차도 올바르게 정렬되어야합니다. 당신은 2000 년 이전 데이터가 관여 한 경우에, 다음이 필요합니다

(샘플 테이블이 포함 된이 - 그냥 무시) indexing에 관해서는

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; 

(당신이 그것을 태그 이후), 두 가지 옵션 :

  1. 연도를 인덱싱 할 수 있으려면 해당 값을 여러 열로 나눠야합니다.
  2. 4 자리 연도를 사용하십시오.
+0

Brilliant. 숫자가 적절히 정렬되었지만 2000 년 이전 수치가 문제였습니다. – Adam

1

첫째 :

CREATE INDEX idx_table_jobnumber ON table (jobnumber); 

다음 :

select jobnumber FROM table ORDER BY jobnumber DESC 

"끔찍하게 실패는"나에게 "천천히"를 의미한다.

1

사용 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 
0

다시 jobnumber DESC 쿼리를 시도하거나 말 왜 실패 하느냐. 어쩌면 샘플 출력이 정확하지 않을 수도 있습니다.

관련 문제