按一列对MySQL结果进行排序,列中的多个值用句点分隔

按一列对MySQL结果进行排序,列中的多个值用句点分隔,mysql,Mysql,我怀疑这可能已经被问到了,但我不知道如何表达这个问题,以便搜索引擎能够找到它 我有一个名为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 这是我到目前为止提出的问题。它几乎可以工作,但最后一个位置没有得到排序 SEL

我怀疑这可能已经被问到了,但我不知道如何表达这个问题,以便搜索引擎能够找到它

我有一个名为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)

有谁能帮我解决这个问题或提出更好的方法吗?

显然有更好的方法将这些信息存储在数据库中,例如将值存储在单独的字段中。然而,不可能总是改变代码库来完成这些事情

但我相信您只需要将最终的orderby添加到查询中,就可以使其按预期工作

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);
选择*
从系统
其中cluster=“”
按强制转换顺序(SUBSTR(SUBSTRING_索引(tcid,'.',1),1)为无符号),
SUBSTR(子串索引(tcid,'.',2),长度(子串索引(tcid,'.',1))+2,
强制转换(SUBSTR(SUBSTRING_INDEX(tcid,,,,,,,,,,,,,,)3),长度(SUBSTRING_INDEX(tcid,,,,,,,,,,,2))+2)为无符号,
强制转换(SUBSTR(SUBSTRING_INDEX(tcid,'.',4))、长度(SUBSTRING_INDEX(tcid,'.',3))+2)为无符号),
强制转换(子串索引(tcid,'.',5),长度(子串索引(tcid,'.',4))+2)为无符号;
请查看此项以查看

只是为了好玩

SELECT *
FROM
(
SELECT '1.A.1.1.1' x
UNION ALL
SELECT '4.A.1.1.1'
UNION ALL
SELECT '2.B.1.1.10'
UNION ALL
SELECT '2.B.1.1.2'
) a
ORDER BY
INET_ATON(CONCAT(MID(x,1,1),MID(x,4,1000)));

更好的方法是将它们存储在4个单独的字段中,在应用程序代码中,concat并按要求使用它们。我想我们都可以建议一个更好的方法:-(@Raven,在您现有的查询中,不要将字符串的最后一部分强制转换为未签名,然后重试!@Madhur Bhaiya,我尝试取消强制转换最后一部分,似乎产生了相同的结果!