我正在开发一个分类帐应用程序。我的主要问题是我的客户有这样的代码的会计科目表
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 之后出现的任何帮助?
提前致谢。
这很丑陋,但它会起作用:
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 检索它的尾随部分(向后阅读,到前导点
添加零,将字符串转换为数值
将值分配给数组并使用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
)
*/
?>
您需要提取小数之间的数字并将它们视为数字。用于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)
SELECT col FROM mytable ORDER BY REPLACE(col, ".", "")+0
REPLACE
删除.
,MySQL 会自动使用数学运算转换字符串。你可以试试REPLACE(col, ".", "")*1
我有一个类似的问题,我已经管理它如下:
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
在您的情况下,您可能需要额外的“深度”。希望这可以帮助您获得一些见解。
如果排序字段是name
然后使用以下ORDER BY
子句
ORDER BY length(name), name