2013-02-20 13 views
6

sagen, dass ich die folgenden Ergebnisse haben:Reihenfolge der MySQL-String-Ergebnisse ohne eine definierte Sortierung?

Mackay 
Mackay Airport 
Melbourne 
Melbourne Airport 
Sydney 
Sydney Ac 
Sydney Airport 

Wie kann ich es so machen sie mit Flughafen immer an der Spitze von ihnen bestellt werden? Alphabetisch, zB:

Mackay Airport 
Mackay 
Melbourne Airport 
Melbourne 
Sydney Airport 
Sydney 
Sydney Ac 

Ein bisschen verwirrt, wie man die Flughäfen prominenter machen kann.

+1

Haben Sie nur "Airport" oder beliebiges alphanumerisches Wort in Betracht ziehen? – Slowcoder

+5

das ist nicht 1NF - Sie sollten ein zusätzliches Attribut erstellen 'isAirport' –

Antwort

2

nicht sicher, ob die folgende Abfrage alle Fälle abdeckt, aber es scheint, mit Beispieldaten zu arbeiten:

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 

mit Tisch es aussehen wird

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

whoa, die Abfrage ist viel schwieriger als das Sortieren von Hand :-) –

+0

:) alle' union' in 'FROM' nur um einen Test zu erstellen, ohne zu erstellen Tabelle .... – a1ex07

1

Es scheint, dass Sie Sie können nicht nach Integer und String gleichzeitig sortieren, aber Sie können die Zeichenfolge ableiten, je nachdem, ob "Airport" vorhanden ist. Es ist albern, aber es funktioniert:

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

hmm ... 'Beerport' wäre 20% cooler –

0

Die folgende Abfrage gibt Ihnen die erwartete Ausgabe (obwohl die Abfrage kompliziert ist).

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; 

Hier ist das Beispiel.

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

Verwandte Themen