按数字排序然后是alpha

时间:2014-08-24 21:31:54

标签: php mysql

SELECT * FROM locations ORDER BY cast(X as decimal), X, Y

此代码的打印方式如下:

ADMIN
CAFE
CDC
CMAT
1 
1.5
2
10
10.5
18

我正在寻找一种方法将alpha放在底部,数字放在顶部,顺序如图所示。

1 
1.5
2
10
10.5
18
ADMIN
CAFE
CDC
CMAT

3 个答案:

答案 0 :(得分:1)

几乎就是

$sql = "(SELECT *,cast(X as decimal) FROM locations WHERE X REGEXP '^[0-9]') UNION ALL
    (SELECT *,X FROM locations WHERE X REGEXP '^[a-z,A-Z]')
    ORDER BY X";

顶部的数字,但1,1.5,10,10.5,18,2

    instead of 1, 1.5, 2, 10, 10.5, 18 

底部的Alpha是按顺序ADMIN,CAFE,CDC,CMAT

答案 1 :(得分:0)

你可以使用2个查询与regexp一个查询的联合来匹配数字并以升序方式对它们进行排序,在第二个查询中只获取非数字的数据

(SELECT * FROM locations 
where x REGEXP '^[0-9]'
order by cast(x as decimal)
 )
union
(SELECT * FROM locations 
where x REGEXP '^[0-9]' = 0
order by x
)

Demo

另一个解决方案是首先通过强制转换然后使用子选择并通过regexp命令

select * from (
select * from  locations 
order by cast(x as decimal) , x
  ) t
order by x REGEXP '^[0-9]' desc

Demo 2

答案 2 :(得分:-1)

$sql = "(SELECT * FROM locations WHERE X REGEXP '^[1-9][0-9]' 
   ORDER BY cast(X as decimal), X, Y)
   UNION ALL
   (SELECT * FROM locations WHERE X REGEXP '^[a-z,A-Z]') ORDER BY X, Y";

将[1-9]添加到REGEXP使其正常工作。