mysql - 按列对 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)
谁能帮我解决这个问题或提出更好的方法来做到这一点?
解决方案
显然有更好的方法可以将此信息存储在数据库中,例如将值存储在单独的字段中。但是,并非总是可以更改代码库来执行此类操作。
但我相信您只需将最终订单添加到您的查询中即可使其按预期工作;
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进行检查
推荐阅读
- cuda - 每个 SM 活动的线程块
- python - 在 Tensorflow 中,如何将一个张量添加到另一个形状不同的张量中?
- dynamic - 如何在设计时编写仅在运行时创建的组件
- c# - unity EditorWindow#Focus 无法触发 OnFocus
- c++ - std::vector 的容量会减少吗?
- asp.net - 如何在移动应用程序中修复服务器错误 500 web api
- rendering - 为什么启用混合时会出现此渲染问题?
- pandas - 在特定的值熊猫序列之后提取一行?
- excel - 不能用 R1C1 公式连接变量
- c++ - 为用户定义的类正确调用复制构造函数/赋值运算符