2011-04-28 2 views
3

내 데이터베이스 필드 중 하나에 서수 접미어를 포함하는 숫자가 있습니다. 난 그들을 오름차순 정렬하려고하지만 서수 접미사를 포함하고 있기 때문에 '101st'문자열에 '1st'보다 큰 값이 할당되고 마찬가지로 '29th'는 '2d'보다 더 큰 값이 할당됩니다.MySQL : Sort '1st'BEFORE '101st'

각 숫자의 서 픽스 접미사를 제거하지 않고도이 문제를 해결할 수있는 방법을 아는 사람이 있습니까?

+0

int 필드로 변경하고 대신 코드에 접미사를 추가하지 않으시겠습니까? – Prix

+0

을 분류하고 관리하는 것이 더 쉬울 것입니다. 필드에도 다른 데이터가 있기 때문입니다. – BenM

+3

접미사없이 번호에 액세스하려면 가난한 데이터베이스 설계를 수정해야합니다. 다른 열을 사용하십시오. – Svisstack

답변

5
order by cast(field as unsigned) 
+0

WOW! 고마워, 닉. – BenM

+1

필자는 MySQL에 익숙하지 않지만 필드에 알파 문자가 포함되어 있으면 실제 데이터베이스가 CAST (임의의 숫자로 필드)에 barf로 바뀝니다. MySQL이 이것을 허용합니까? –

+1

@Ken - mysql은 실제 데이터베이스가 아닙니다. – nickf

0

열 유형은 아마 영숫자 유형이므로 알파벳 순서 규칙에 따라 정렬됩니다. 열은 숫자 형이어야하므로 숫자 형으로 정렬됩니다. 필자는 열에 숫자 형식 (int)을 사용하는 것이 강력하게 권장되며,이 경우 영숫자 형식보다 많은 이점을 제공하며 유일한 단점은 접미사 손실입니다. 그러나 가치를 얻은 후에는 검색된 값에 접미사를 추가하는 것이 쉬워야합니다.

Does mysql have function for returning a number with ordinal suffix?은 접미사를 값에 추가하는 방법을 제안합니다.

2

Like ... @nick rulez ...이 경우에는 파생 열을 기준으로 쿼리를 정렬 할 수 있습니다.이 경우에는 즉시 정수로 캐스팅합니다.

작은 세트에서는 효과가 있지만 큰 세트 나 많은 트래픽이있는 경우 쿼리 속도를 높이기 위해 색인 된 열에 해당 번호를 저장하는 것이 좋습니다.

+0

+1 –

0

여기에서 언급 한 것과 비슷한 문제가있었습니다. 나는 PHP의 natsort()와 같은 다른 언어로 그 데이터를 처리 할 필요없이 자연 정렬을 구현하기를 원했다. 이 솔루션을 발견하고 완벽하게 작동했습니다.

ORDER BY LENGTH(field), field