SQL 查询,对两个子串进行排序
SQL Query, Sort on Two Substrings
我希望根据第二个数字然后是第三个数字对列中的所有内容进行排序。
例如:
1.197.980 大于
1.191.5061
我当前的 SQL 查询如下。
SELECT av_sig_ver
,CONVERT(SUBSTRING_INDEX(av_sig_ver,'.',-2),UNSIGNED INTEGER) AS 'av_sig_ver'
FROM `test`.`test_fep_signatures`
ORDER BY av_sig_ver DESC
LIMIT 50;
我得到以下输出。
+--------------+------------+
| av_sig_ver | av_sig_ver |
+--------------+------------+
| 1.191.5061.0 | 5061 |
| 1.191.5061.0 | 5061 |
| 1.191.5061.0 | 5061 |
| 1.191.5061.0 | 5061 |
| 1.191.5015.0 | 5015 |
| 1.191.5015.0 | 5015 |
| 1.191.4993.0 | 4993 |
| 1.191.4993.0 | 4993 |
| 1.191.4960.0 | 4960 |
| 1.191.4710.0 | 4710 |
| 1.191.4634.0 | 4634 |
| 1.191.4634.0 | 4634 |
| 1.191.4634.0 | 4634 |
| 1.191.4588.0 | 4588 |
| 1.195.3814.0 | 3814 |
| 1.195.3814.0 | 3814 |
| 1.195.3814.0 | 3814 |
| 1.195.3814.0 | 3814 |
| 1.195.3814.0 | 3814 |
| 1.195.3814.0 | 3814 |
| 1.195.3814.0 | 3814 |
| 1.195.3814.0 | 3814 |
| 1.195.3797.0 | 3797 |
| 1.195.3797.0 | 3797 |
| 1.195.3797.0 | 3797 |
| 1.195.3764.0 | 3764 |
| 1.195.3764.0 | 3764 |
| 1.195.3764.0 | 3764 |
| 1.195.3764.0 | 3764 |
| 1.195.3741.0 | 3741 |
| 1.195.3711.0 | 3711 |
| 1.195.3623.0 | 3623 |
| 1.195.3600.0 | 3600 |
| 1.195.3600.0 | 3600 |
| 1.195.3600.0 | 3600 |
| 1.195.3600.0 | 3600 |
| 1.195.3510.0 | 3510 |
| 1.193.3509.0 | 3509 |
| 1.193.3509.0 | 3509 |
| 1.193.3509.0 | 3509 |
| 1.193.3509.0 | 3509 |
| 1.193.3509.0 | 3509 |
| 1.193.3485.0 | 3485 |
| 1.193.3485.0 | 3485 |
| 1.195.3480.0 | 3480 |
| 1.195.3480.0 | 3480 |
| 1.191.3480.0 | 3480 |
| 1.195.3480.0 | 3480 |
| 1.195.3480.0 | 3480 |
| 1.195.3480.0 | 3480 |
+--------------+------------+
50 rows in set, 11160 warnings (0.01 sec)
所以我非常想按第一个“.”之后的数字排序。然后在第二个句点“.”之后排序。我希望四位数高于三位数。我希望这一切都有意义。 :)
所以我应该有以下内容:
1.197.XXXX
1.197.XXX
1.195.XXXX
1.195.XXX
1.193.XXXX
1.193.XXX
1.191.XXXX
1.191.XXX
编辑:已解决
感谢您的建议。让我思考正确的方向。这是我的解决方法。 :)
SELECT av_sig_ver
,CONVERT(SUBSTRING_INDEX(av_sig_ver,'.',-2),UNSIGNED INTEGER) AS 'one_av_sig_ver'
,CONVERT(SUBSTRING_INDEX(av_sig_ver,'.',-3),UNSIGNED INTEGER) AS 'two_av_sig_ver'
,COUNT(NULLIF(TRIM(av_sig_ver), '')) AS 'total'
FROM `test`.`test_fep_signatures`
GROUP by av_sig_ver
ORDER BY two_av_sig_ver DESC, one_av_sig_ver DESC;
SELECT av_sig_ver
,CONVERT(SUBSTRING_INDEX(av_sig_ver,'.',-2),UNSIGNED INTEGER) AS 'one_av_sig_ver'
,CONVERT(SUBSTRING_INDEX(av_sig_ver,'.',-3),UNSIGNED INTEGER) AS 'two_av_sig_ver'
,COUNT(NULLIF(TRIM(av_sig_ver), '')) AS 'total'
FROM `test`.`test_fep_signatures`
GROUP by av_sig_ver
ORDER BY two_av_sig_ver DESC, one_av_sig_ver DESC;
我希望根据第二个数字然后是第三个数字对列中的所有内容进行排序。
例如:
1.197.980 大于 1.191.5061
我当前的 SQL 查询如下。
SELECT av_sig_ver
,CONVERT(SUBSTRING_INDEX(av_sig_ver,'.',-2),UNSIGNED INTEGER) AS 'av_sig_ver'
FROM `test`.`test_fep_signatures`
ORDER BY av_sig_ver DESC
LIMIT 50;
我得到以下输出。
+--------------+------------+
| av_sig_ver | av_sig_ver |
+--------------+------------+
| 1.191.5061.0 | 5061 |
| 1.191.5061.0 | 5061 |
| 1.191.5061.0 | 5061 |
| 1.191.5061.0 | 5061 |
| 1.191.5015.0 | 5015 |
| 1.191.5015.0 | 5015 |
| 1.191.4993.0 | 4993 |
| 1.191.4993.0 | 4993 |
| 1.191.4960.0 | 4960 |
| 1.191.4710.0 | 4710 |
| 1.191.4634.0 | 4634 |
| 1.191.4634.0 | 4634 |
| 1.191.4634.0 | 4634 |
| 1.191.4588.0 | 4588 |
| 1.195.3814.0 | 3814 |
| 1.195.3814.0 | 3814 |
| 1.195.3814.0 | 3814 |
| 1.195.3814.0 | 3814 |
| 1.195.3814.0 | 3814 |
| 1.195.3814.0 | 3814 |
| 1.195.3814.0 | 3814 |
| 1.195.3814.0 | 3814 |
| 1.195.3797.0 | 3797 |
| 1.195.3797.0 | 3797 |
| 1.195.3797.0 | 3797 |
| 1.195.3764.0 | 3764 |
| 1.195.3764.0 | 3764 |
| 1.195.3764.0 | 3764 |
| 1.195.3764.0 | 3764 |
| 1.195.3741.0 | 3741 |
| 1.195.3711.0 | 3711 |
| 1.195.3623.0 | 3623 |
| 1.195.3600.0 | 3600 |
| 1.195.3600.0 | 3600 |
| 1.195.3600.0 | 3600 |
| 1.195.3600.0 | 3600 |
| 1.195.3510.0 | 3510 |
| 1.193.3509.0 | 3509 |
| 1.193.3509.0 | 3509 |
| 1.193.3509.0 | 3509 |
| 1.193.3509.0 | 3509 |
| 1.193.3509.0 | 3509 |
| 1.193.3485.0 | 3485 |
| 1.193.3485.0 | 3485 |
| 1.195.3480.0 | 3480 |
| 1.195.3480.0 | 3480 |
| 1.191.3480.0 | 3480 |
| 1.195.3480.0 | 3480 |
| 1.195.3480.0 | 3480 |
| 1.195.3480.0 | 3480 |
+--------------+------------+
50 rows in set, 11160 warnings (0.01 sec)
所以我非常想按第一个“.”之后的数字排序。然后在第二个句点“.”之后排序。我希望四位数高于三位数。我希望这一切都有意义。 :)
所以我应该有以下内容:
1.197.XXXX
1.197.XXX
1.195.XXXX
1.195.XXX
1.193.XXXX
1.193.XXX
1.191.XXXX
1.191.XXX
编辑:已解决 感谢您的建议。让我思考正确的方向。这是我的解决方法。 :)
SELECT av_sig_ver
,CONVERT(SUBSTRING_INDEX(av_sig_ver,'.',-2),UNSIGNED INTEGER) AS 'one_av_sig_ver'
,CONVERT(SUBSTRING_INDEX(av_sig_ver,'.',-3),UNSIGNED INTEGER) AS 'two_av_sig_ver'
,COUNT(NULLIF(TRIM(av_sig_ver), '')) AS 'total'
FROM `test`.`test_fep_signatures`
GROUP by av_sig_ver
ORDER BY two_av_sig_ver DESC, one_av_sig_ver DESC;
SELECT av_sig_ver
,CONVERT(SUBSTRING_INDEX(av_sig_ver,'.',-2),UNSIGNED INTEGER) AS 'one_av_sig_ver'
,CONVERT(SUBSTRING_INDEX(av_sig_ver,'.',-3),UNSIGNED INTEGER) AS 'two_av_sig_ver'
,COUNT(NULLIF(TRIM(av_sig_ver), '')) AS 'total'
FROM `test`.`test_fep_signatures`
GROUP by av_sig_ver
ORDER BY two_av_sig_ver DESC, one_av_sig_ver DESC;