获取 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;
这样做就可以了:
SELECT folio
FROM services
ORDER BY LEFT(folio, 4) DESC, SUBSTR(folio, 5) + 0 DESC
LIMIT 1
在 MySql 中,您可以将整数视为字符串并应用 LEFT()
和 SUBSTR()
.
等函数
通过将 +0
应用于字符串,该字符串将隐式转换为数字。
见 demo.
结果:
| folio |
| ------ |
| 202019 |
我需要从服务中获取最大的作品集编号记录 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;
这样做就可以了:
SELECT folio
FROM services
ORDER BY LEFT(folio, 4) DESC, SUBSTR(folio, 5) + 0 DESC
LIMIT 1
在 MySql 中,您可以将整数视为字符串并应用 LEFT()
和 SUBSTR()
.
等函数
通过将 +0
应用于字符串,该字符串将隐式转换为数字。
见 demo.
结果:
| folio |
| ------ |
| 202019 |