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