在php或mysql中排序十进制

时间:2013-07-25 04:10:53

标签: php mysql sorting

我正在开发一个分类帐应用程序。我的主要问题是我的客户的账户图表有这样的代码

1.1.1, 
1.1.2 
...... 
1.1.10, 
1.1.11,
.........

使用PHP或MySQl我只能设法将它们排序为

1.1.1, 
1.1.10, 
1.1.11,
1.1.2, 
.......

有关如何对其进行排序以使1.1.10在1.1.9之后出现的任何帮助吗?

提前致谢。

6 个答案:

答案 0 :(得分:3)

这很难看,但它会起作用:

ORDER
   BY SUBSTRING_INDEX(CONCAT( col ,'.'),'.',1) + 0
    , SUBSTRING_INDEX(SUBSTRING_INDEX(CONCAT( col ,'.'),'.',2),'.',-1) + 0
    , SUBSTRING_INDEX(SUBSTRING_INDEX(CONCAT( col ,'.'),'.',3),'.',-1) + 0
    , SUBSTRING_INDEX(SUBSTRING_INDEX(CONCAT( col ,'.'),'.',4),'.',-1) + 0
    , SUBSTRING_INDEX(SUBSTRING_INDEX(CONCAT( col ,'.'),'.',5),'.',-1) + 0
    , SUBSTRING_INDEX(SUBSTRING_INDEX(CONCAT( col ,'.'),'.',6),'.',-1) + 0
    , SUBSTRING_INDEX(SUBSTRING_INDEX(CONCAT( col ,'.'),'.',7),'.',-1) + 0

要测试这些表达式,您可以在SELECT中使用它们并验证它们是否提取正确的组件,并且它们是正确排序的:

SELECT col
     , SUBSTRING_INDEX(CONCAT( col ,'.'),'.',1) + 0 AS p1
     , SUBSTRING_INDEX(SUBSTRING_INDEX(CONCAT( col ,'.'),'.',2),'.',-1) + 0 AS p2
     , SUBSTRING_INDEX(SUBSTRING_INDEX(CONCAT( col ,'.'),'.',3),'.',-1) + 0 AS p3
     , SUBSTRING_INDEX(SUBSTRING_INDEX(CONCAT( col ,'.'),'.',4),'.',-1) + 0 AS p4
     , SUBSTRING_INDEX(SUBSTRING_INDEX(CONCAT( col ,'.'),'.',5),'.',-1) + 0 AS p5
     , SUBSTRING_INDEX(SUBSTRING_INDEX(CONCAT( col ,'.'),'.',6),'.',-1) + 0 AS p6
     , SUBSTRING_INDEX(SUBSTRING_INDEX(CONCAT( col ,'.'),'.',7),'.',-1) + 0 AS p7
  FROM mytable 
 ORDER BY 2,3,4,5,6,7,8

而不是解释这是如何工作的,我只是打击重要的“技巧”

  • 追加一个尾随的“。”在col的末尾,你需要这样,所以你不会多次回到最后一个位置,

  • 使用SUBSTRING_INDEX检索最多第n个部分。'

  • 使用SUBSTRING_INDEX检索其尾随部分(向后读取,到前导点

  • 添加零,将字符串转换为数值

答案 1 :(得分:2)

你需要拉出小数点之间的数字并将它们视为数字。使用SUBSTRING_INDEX拉出数字,然后CAST将数字转换为数字:

SELECT *
FROM myAccounts
ORDER BY
  CAST(SUBSTRING_INDEX(account_number, '.', 1) AS UNSIGNED),
  CAST(SUBSTRING_INDEX(account_number, '.', -2) AS UNSIGNED),
  CAST(SUBSTRING_INDEX(account_number, '.', -1) AS UNSIGNED)

答案 2 :(得分:1)

将值分配给数组并使用natsort()自然地对值进行排序。

$foo = array ('1.1.1', '1.1.2', '1.1.10', '1.1.11');
natsort ($foo);
print_r ($foo);

/*
Array
(
    [0] => 1.1.1
    [1] => 1.1.2
    [2] => 1.1.10
    [3] => 1.1.11
)
*/

?>

答案 3 :(得分:0)

如果排序字段为name,则使用以下ORDER BY子句

ORDER BY length(name), name

答案 4 :(得分:0)

我遇到了类似的问题,我已将其管理如下:

SELECT .... , CAST(SUBSTRING([column_name],1) AS UNSIGNED) AS myNum,  CAST(SUBSTRING([column_name],3) AS UNSIGNED) AS myDec
FROM ...
WHERE ...
ORDER BY myNum, myDec

在您的情况下,您可能需要额外的"深度"。 希望这有助于您获得一些见解。

答案 5 :(得分:0)

SELECT col FROM mytable ORDER BY REPLACE(col, ".", "")+0

REPLACE删除.,MySQL会通过数学运算自动转换字符串。您可以尝试REPLACE(col, ".", "")*1