首页 > 解决方案 > 按列对 MySQL 结果进行排序,其中几个值用句点分隔

问题描述

我怀疑这可能已经被问过了,但我不知道如何表达这个问题,以便 SO 搜索引擎选择它。

我有一个名为 TCID 的列,其中包含以下格式的值:

1.A.1.1.1
4.A.1.1.1
2.B.1.1.10
2.B.1.1.2
...

此 TCID 中有 5 个单位,以句点分隔。我希望左边的位置优先级最高,最后最后一位是最低优先级。

所以它会像这样排序:

1.A.1.1.1
2.B.1.1.2
2.B.1.1.10
4.A.1.1.1

这是我到目前为止的查询。它几乎可以工作,但最后一个位置没有得到排序。

SELECT * 
FROM system 
WHERE cluster = \"$tc_name\"
ORDER BY CAST(SUBSTR( SUBSTRING_INDEX(tcid,'.',1) , 1 ) AS UNSIGNED),
         SUBSTR( SUBSTRING_INDEX(tcid,'.',2) , LENGTH( SUBSTRING_INDEX(tcid,'.',1)) + 2 ),
         CAST(SUBSTR( SUBSTRING_INDEX(tcid,'.',3) , LENGTH( SUBSTRING_INDEX(tcid,'.',2)) + 2 ) AS UNSIGNED),
         CAST(SUBSTR( SUBSTRING_INDEX(tcid,'.',4) , LENGTH( SUBSTRING_INDEX(tcid,'.',3)) + 2 ) AS UNSIGNED)

谁能帮我解决这个问题或提出更好的方法来做到这一点?

标签: mysql

解决方案


显然有更好的方法可以将此信息存储在数据库中,例如将值存储在单独的字段中。但是,并非总是可以更改代码库来执行此类操作。

但我相信您只需将最终订单添加到您的查询中即可使其按预期工作;

SELECT *
FROM system
WHERE cluster = "<some search term>"
ORDER BY CAST(SUBSTR( SUBSTRING_INDEX(tcid,'.',1) , 1 ) AS UNSIGNED),
         SUBSTR( SUBSTRING_INDEX(tcid,'.',2) , LENGTH( SUBSTRING_INDEX(tcid,'.',1)) + 2 ),
         CAST(SUBSTR( SUBSTRING_INDEX(tcid,'.',3) , LENGTH( SUBSTRING_INDEX(tcid,'.',2)) + 2 ) AS UNSIGNED),
         CAST(SUBSTR( SUBSTRING_INDEX(tcid,'.',4) , LENGTH( SUBSTRING_INDEX(tcid,'.',3)) + 2 ) AS UNSIGNED),
         CAST(SUBSTR( SUBSTRING_INDEX(tcid,'.',5) , LENGTH( SUBSTRING_INDEX(tcid,'.',4)) + 2 ) AS UNSIGNED);

请查看此sqlfiddle进行检查


推荐阅读