2013-02-20 19 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

whoaは、手で並べ替えるよりもはるかに難しいです:-) –

+0

:)' FROM'のすべての 'union'sは、テーブル.... .... – a1ex07

1

それはあなたができると思われます整数と文字列を同時に並べ替えることはできますが、 "空港"が存在するかどうかに基づいて注文する文字列を導出できます。それは愚かだが、それは動作します:

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

hmm ... 'ビールポート'は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

関連する問題