2013-02-20 64 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 2013-02-20 00:14:35

+5

这不是1NF - 你应该创建一个额外的属性isAirport' – 2013-02-20 00:29:18

回答

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,查询比手工排序难得多:-) – 2013-02-20 00:26:49

+0

:)所有'FROM'中的'union's只是为了运行测试而不创建桌子...... – a1ex07 2013-02-20 00:29:21

1

看来,你可以不能同时按整数和字符串排序,但可以根据“Airport”是否存在来导出要排序的字符串。这是愚蠢的,但它的工作原理:

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

嗯...'Beerport'会冷却20% – 2013-02-20 00:33:24

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