3

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

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 之后出现的任何帮助?

提前致谢。

4

6 回答 6

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 检索它的尾随部分(向后阅读,到前导点

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

于 2013-07-25T04:46:46.587 回答
2

将值分配给数组并使用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
)
*/

?>
于 2013-07-25T04:28:17.367 回答
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)
于 2013-07-25T04:29:03.077 回答
2
SELECT col FROM mytable ORDER BY REPLACE(col, ".", "")+0

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

于 2019-10-17T15:04:44.920 回答
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

在您的情况下,您可能需要额外的“深度”。希望这可以帮助您获得一些见解。

于 2013-07-25T04:33:05.410 回答
0

如果排序字段是name然后使用以下ORDER BY子句

ORDER BY length(name), name
于 2013-07-25T04:19:24.913 回答