获取 MAX int 列但避免自然顺序 MySQL

Getting MAX int column but avoiding natural order MySQL

我需要从服务中获取最大的作品集编号记录 table:

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 将不起作用,因为自然排序顺序。它将return最大的整数。

这样做: SELECT MAX(folio) FROM services LIMIT 1; returns 2019125 当我实际需要得到 202019

将其视为 varchar 也行不通,因为它将按 char 排序: SELECT MAX(CONVERT(folio, CHAR(50))) FROM services LIMIT 1; returns 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 |