2013-02-20 3 views
6

내가 다음과 같은 결과를 가지고 말 :정의 된 데이터 정렬없이 MySQL 문자열 결과를 주문 하시겠습니까?

Mackay 
Mackay Airport 
Melbourne 
Melbourne Airport 
Sydney 
Sydney Ac 
Sydney Airport 

가 어떻게이 때문에이 항상 상단에 공항으로 정렬 할 수 있습니다 ? 알파벳순으로 예 :

Mackay Airport 
Mackay 
Melbourne Airport 
Melbourne 
Sydney Airport 
Sydney 
Sydney Ac 

공항을 더욱 눈에 잘 띄게 만드는 방법에 대해 조금 혼란 스럽습니다.

+1

"공항"또는 영숫자 만 사용하십니까? – Slowcoder

+5

이것은 1NF가 아닙니다 - 추가 속성'isAirport'를 작성해야합니다 –

답변

2

다음 쿼리는 모든 경우를 포함하지만, 당신의 샘플 데이터로 작동하는 것 같다 확실하지 : 테이블

select name, 
SUBSTRING_INDEX(name,'Airport',1) 
as l, 
LOCATE('Airport',name) as r from 
(
select 'Sydney Airport' as name 
union all 
select 'Sydney' 
union all 
select 'Sydney Ac' 
union all 
select ' 
Mackay Airport' 
union all 
select 'Mackay' 
union all 
select 'Melbourne' 
union all 
select 'Melbourne Airport' 
)a 
order by l asc, r desc 

가이 모양을가

select name 
from table1 
ORDER BY SUBSTRING_INDEX(name,'Airport',1) ASC, 
LOCATE('Airport',name) DESC 
+0

와우, 쿼리는 손으로 정렬하는 것보다 훨씬 어렵습니다 :-) –

+0

:) 'FROM'의 모든'union'은 생성하지 않고 테스트를 실행합니다. 테이블 .... – a1ex07

1

그것은 당신이 할 수있는 것 같다 정수와 문자열로 동시에 정렬하지 않지만 "공항"이 있는지 여부에 따라 정렬 할 문자열을 파생시킬 수 있습니다. 바보 같지만 작동합니다 :

ORDER BY IF(name NOT LIKE '% Airport', CONCAT(name, ' Birport'), name) 
+1

흠 ...'맥주가'20 % 쿨러 것입니다 –

0

다음 쿼리는 쿼리가 복잡해도 예상되는 결과를 제공합니다.

SELECT t.name 
FROM (
SELECT @num := IF(@num IS NULL, 1, @num+1) AS number, name 
FROM places 
ORDER BY IF ((name LIKE '% Airport'), SUBSTRING(name, 1, LOCATE(' Airport', name) - 1), name)  DESC) t 
ORDER BY t.number DESC; 

다음은 예제입니다.

http://www.sqlfiddle.com/#!2/117b7/80