如何解决获取MAX int列,但避免使用自然顺序MySQL
我需要从服务表中获取最大的作品集编号记录:
services
- id
- folio (int)
作品集编号是由year + incremental number
组成的Int列。每次插入记录时,the_current_year + (max folio found + 1)
都会形成作品集编号,这是可用作品集的示例列表:
20191
...
2019124
2019125
20201
20202
...
202019
根据样本列表,到目前为止,我将在2019年提供125个服务,并在2020年提供19个服务。请注意,每年更改时,作品集编号的最新数字均从1开始。
我在这里面临2个问题。将其视为整数并通过folio获取MAX无效,因为自然的排序顺序。它将返回最大的整数。
这样做:
当我实际上需要获取SELECT MAX(folio) FROM services LIMIT 1;
时,2019125
返回202019
将其作为varchar进行处理将无法正常工作,因为它将由char进行排序:
SELECT MAX(CONVERT(folio,CHAR(50))) FROM services LIMIT 1;
返回20202
而不是202019
所以我的问题是如何获取最新的作品集编号?
解决方法
最好将年份和序列号放在不同的列中。您可以在查询中将它们分开:
SELECT folio
FROM (
SELECT
CAST(substring(folio,1,4) AS UNSIGNED) as 'year',CAST(substring(folio,5) AS UNSIGNED) as 'service_no',folio
FROM services
ORDER BY year DESC,service_no DESC
limit 1
) AS q;
请参见db-fiddle
,这可以做到:
SELECT folio
FROM services
ORDER BY LEFT(folio,4) DESC,SUBSTR(folio,5) + 0 DESC
LIMIT 1
在MySql中,您可以将整数视为字符串,并应用LEFT()
和SUBSTR()
之类的函数。
通过将+0
应用于字符串,该字符串将隐式转换为数字。
请参见demo。
结果:
| folio |
| ------ |
| 202019 |
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。