我正在开发一个分类帐应用程序。我的主要问题是我的客户的账户图表有这样的代码
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之后出现的任何帮助吗?
提前致谢。
答案 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