MySQL 列按字母数字顺序排列,忽略最大值
MySQL column order by alphanumeric ignoring highest value
在 MySQL 中,我有一个名为 custom_meta 的 table,我在其中获取类似
的值
id meta_value
1 USNEWYORK01
2 USNEWYORK02
3 USNEWYORK03
4 USNEWYORK04
5 USNEWYORK05
6 USNEWYORK06
7 USNEWYORK07
8 USNEWYORK10
9 USNEWYORK14
10 USNEWYORK16
11 USNEWYORK20
12 USNEWYORK21
13 USNEWYORK32
14 USNEWYORK45
15 USNEWYORK56
16 USNEWYORK78
17 USNEWYORK68
18 USNEWYORK69
19 USNEWYORK80
20 USNEWYORK90
21 USNEWYORK99
22 USNEWYORK100
23 USNEWYORK45
24 USNEWYORK101
现在我想获得数字最大的 meta_value。所以在table中可以看到最高的是USNEWYORK101
。所以为了得到我做了这样的查询
SELECT meta_value from custom_meta ORDER BY meta_value DESC LIMIT 1
但它总是 USNEWYORK99
。我也尝试过使用 CAST
,但这也不起作用。
有人可以帮我完成这件事吗?任何建议和建议都将不胜感激。
谢谢。
对于 MySQL 的较新版本,您可以使用 REGEXP_SUBSTR()
函数,但由于您使用的是 5.7,我们可以采用其他方式。
假设你的值的开头总是有 USNEWYORK
,你可以去掉它,只留下使用 SUBSTRING()
函数之后的内容。然后您需要执行 CAST()
将文本转换为数值,以便排序正常进行。
示例数据
create table custom_meta(meta_value varchar(255));
insert into custom_meta(meta_value) values
('USNEWYORK01'),('USNEWYORK02'),('USNEWYORK45'),('USNEWYORK99'),('USNEWYORK101');
解决方案
select
meta_value
from
custom_meta
order by
cast(substring(meta_value, 10) as unsigned) desc
limit 1
输出
meta_value
USNEWYORK101
像这样替换并转换为 int:
- IF 前缀固定为 USNEWYORK:
select * from test
order by CAST(REPLACE(meta_value, "USNEWYORK", "") AS SIGNED) desc;
- IF 前缀不固定,可以是任何内容,并且 mysqldb 8.0
select * from test
order by CAST(REGEXP_REPLACE(meta_value, '[^0-9]', '') AS SIGNED) desc;
- IF 前缀不固定,可以是任何内容,mysqldb 5.7
您可以创建解释 here 的函数并像这样使用它:
select * from test
order by CAST(STRIP_NON_DIGIT(meta_value) AS SIGNED) desc;
SELECT id,
meta_value,
Cast(Substring(meta_value, 10, Length(meta_value)) AS UNSIGNED)
FROM custom_meta
ORDER BY 3 DESC
LIMIT 1;
对于 MySQL 5.7
并且仅当字符串包含大写字母的另一种方法是:
select meta_value,
cast(replace
(replace
(replace
(replace
(replace
(replace
(replace
(replace
(replace
(replace
(replace
(replace
(replace
(replace
(replace
(replace
(replace
(replace
(replace
(replace
(replace
(replace
(replace
(replace
(replace
(replace(meta_value,'A','')
,'B','')
,'C','')
,'D','')
,'E','')
,'F','')
,'G','')
,'H','')
,'I','')
,'J','')
,'K','')
,'L','')
,'M','')
,'N','')
,'O','')
,'P','')
,'Q','')
,'R','')
,'S','')
,'T','')
,'U','')
,'V','')
,'W','')
,'X','')
,'Y','')
,'Z','')
as UNSIGNED)
as nr
from test
order by nr desc;
在 MySQL 中,我有一个名为 custom_meta 的 table,我在其中获取类似
的值id meta_value
1 USNEWYORK01
2 USNEWYORK02
3 USNEWYORK03
4 USNEWYORK04
5 USNEWYORK05
6 USNEWYORK06
7 USNEWYORK07
8 USNEWYORK10
9 USNEWYORK14
10 USNEWYORK16
11 USNEWYORK20
12 USNEWYORK21
13 USNEWYORK32
14 USNEWYORK45
15 USNEWYORK56
16 USNEWYORK78
17 USNEWYORK68
18 USNEWYORK69
19 USNEWYORK80
20 USNEWYORK90
21 USNEWYORK99
22 USNEWYORK100
23 USNEWYORK45
24 USNEWYORK101
现在我想获得数字最大的 meta_value。所以在table中可以看到最高的是USNEWYORK101
。所以为了得到我做了这样的查询
SELECT meta_value from custom_meta ORDER BY meta_value DESC LIMIT 1
但它总是 USNEWYORK99
。我也尝试过使用 CAST
,但这也不起作用。
有人可以帮我完成这件事吗?任何建议和建议都将不胜感激。
谢谢。
对于 MySQL 的较新版本,您可以使用 REGEXP_SUBSTR()
函数,但由于您使用的是 5.7,我们可以采用其他方式。
假设你的值的开头总是有 USNEWYORK
,你可以去掉它,只留下使用 SUBSTRING()
函数之后的内容。然后您需要执行 CAST()
将文本转换为数值,以便排序正常进行。
示例数据
create table custom_meta(meta_value varchar(255));
insert into custom_meta(meta_value) values
('USNEWYORK01'),('USNEWYORK02'),('USNEWYORK45'),('USNEWYORK99'),('USNEWYORK101');
解决方案
select
meta_value
from
custom_meta
order by
cast(substring(meta_value, 10) as unsigned) desc
limit 1
输出
meta_value
USNEWYORK101
像这样替换并转换为 int:
- IF 前缀固定为 USNEWYORK:
select * from test
order by CAST(REPLACE(meta_value, "USNEWYORK", "") AS SIGNED) desc;
- IF 前缀不固定,可以是任何内容,并且 mysqldb 8.0
select * from test
order by CAST(REGEXP_REPLACE(meta_value, '[^0-9]', '') AS SIGNED) desc;
- IF 前缀不固定,可以是任何内容,mysqldb 5.7 您可以创建解释 here 的函数并像这样使用它:
select * from test
order by CAST(STRIP_NON_DIGIT(meta_value) AS SIGNED) desc;
SELECT id,
meta_value,
Cast(Substring(meta_value, 10, Length(meta_value)) AS UNSIGNED)
FROM custom_meta
ORDER BY 3 DESC
LIMIT 1;
对于 MySQL 5.7
并且仅当字符串包含大写字母的另一种方法是:
select meta_value,
cast(replace
(replace
(replace
(replace
(replace
(replace
(replace
(replace
(replace
(replace
(replace
(replace
(replace
(replace
(replace
(replace
(replace
(replace
(replace
(replace
(replace
(replace
(replace
(replace
(replace
(replace(meta_value,'A','')
,'B','')
,'C','')
,'D','')
,'E','')
,'F','')
,'G','')
,'H','')
,'I','')
,'J','')
,'K','')
,'L','')
,'M','')
,'N','')
,'O','')
,'P','')
,'Q','')
,'R','')
,'S','')
,'T','')
,'U','')
,'V','')
,'W','')
,'X','')
,'Y','')
,'Z','')
as UNSIGNED)
as nr
from test
order by nr desc;