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:

  1. IF 前缀固定为 USNEWYORK:

select * from test 
    order by  CAST(REPLACE(meta_value, "USNEWYORK", "") AS SIGNED) desc;

  1. IF 前缀不固定,可以是任何内容,并且 mysqldb 8.0

select * from test 
    order by  CAST(REGEXP_REPLACE(meta_value, '[^0-9]', '') AS SIGNED) desc;

  1. 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;

演示:https://www.db-fiddle.com/f/7yUJcuMJPncBBnrExKbzYz/38