我怀疑可能已经有人问过这个问题,但我不确定如何用短语表达问题,以便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)


谁能帮助我解决此问题,或提出更好的解决方法?

最佳答案

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

但是我相信您只需要在查询中添加最终订单,即可使其按预期工作;

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进行检查

10-08 08:39