2012-01-09 2 views
1

데이터베이스로 가져온 외부 CSV 제품 피드로 작업하고 있는데, 각 행의 결과가 비교 테이블의 최종 사용자에게 표시됩니다.Mysql - 필드 내의 특정 데이터로 정렬

특정 열은 개별적으로 정렬하려는 많은 세부 사항을 포함합니다. 피드/테이블 구조는 변경할 수 없습니다. DB를 공급 테이블의

예 :

MODEL | SPECIFICATIONS           | AGE 
Car 1A | 1000 miles recorded, 10 previous owners, No tax included | 3 years 
Car 1B | 1000 miles recorded, 5 previous owners, No tax included | 5 years 
Car 1C | 6000 miles recorded, 7 previous owners, No tax included | 5 years 
Bike 1D | 3000 miles recorded, 5 previous owners, 100 tax included | 4 years 

현재 내는 mysql_query 문 '모델 ORDER'은을 사용합니다.

SPECIFICATIONS 열에 '이전 소유자'의 수로 정렬 된 비교표를 표시하고 싶습니다.

ORDER BY 명령문에서이 작업을 수행 할 수 있습니까?

감사합니다.

답변

1

더미 설정 MySQL 데이터베이스에서 테이블 설정을 테스트하고 다음 솔루션을 제안했습니다.

SELECT *, CAST(TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(specifications, ',', -2), ' ', 2)) as unsigned integer) as previousowners 
FROM dbfeed  
ORDER BY previousowners;  

그것은 사양 필드로 구분 적어도 두 개의 섹션이 있다고 가정하고, 소유자의 수와 텍스트 "이전 소유자"사이에 공백이 있음.

+0

이것은 제가 원했던 덕분에 잘 작동합니다, 감사합니다. 데이터 구조 때문에 나는 '2'SUBSTRING_INDEX를 확실히 제거 할 수 있었고 원하는 결과를 얻으려면 TRIM과 -2 SUBSTR을 그대로 두었습니다. –

1

예, 다소 복잡하고 깨지기 쉽습니다. 따라서 first rule of database normalization입니다.

뭔가 같은 ....

ORDER BY CAST (
    SUBSTR(specifications 
    , LOCATE(', ', specifications) 
    , LOCATE(' ', specifications, LOCATE(', ', specifications)+2) 
    ) 
) AS INT; 

이 사이의 문자열을 찾을 것이다 ''와 ''후속.

형식이 사용자의 예와 정확하게 일치하지 않으면 비정상적인 결과가 나타납니다.

+1

MySQL의'SUBSTR'에 대한 세 번째 매개 변수는 _end_index_가 아닌 _length_이므로이 값을 계산하거나'2'를 사용하여 <99 명의 이전 소유자가 있다고 가정하고 한 자리에 후행 공백이 있다고 가정합니다 사례. – mikej

+0

@mikej : 네, 실제로 발견되었습니다. 그러나 ',', ''... 사이의 길이를 얻을 수 있습니다 ...SUBSTR (사양 , LOCATE (',', 사양) , LOCATE ('', specifications, LOCATE (',' , 사양) +2) - 위치 (',', 사양) ) ) AS INT; – symcbean