mysql从字符串字段获取最大值

mysql从字符串字段获取最大值,mysql,sql,Mysql,Sql,我需要从值的一部分中获取最大值,该值通常以年份开头,后跟斜杠(/)。所以我需要一个斜杠(/)后的最大数字,但年份应该是2016年 2016/422 2016/423 2016/469 2016/0470 2014/777 2015/123 2015/989 我试过这个问题 SELECT columname FROM tablename WHERE columname LIKE '2016/%' ORDER BY id DESC 上述查询总是以“2016/469”作为第一条记录,如何将“2

我需要从值的一部分中获取最大值,该值通常以年份开头,后跟斜杠(
/
)。所以我需要一个斜杠(/)后的最大数字,但年份应该是2016年

2016/422
2016/423
2016/469
2016/0470
2014/777
2015/123
2015/989
我试过这个问题

SELECT columname FROM tablename WHERE columname LIKE '2016/%'  ORDER BY id  DESC
上述查询总是以“2016/469”作为第一条记录,如何将“2016/0470”作为最大数量

任何帮助都将不胜感激


谢谢。

如果columname遵循YEAR/0000模式,您可以使用MySQL中的SUBSTRING函数删除您不需要的字符串部分

SELECT value FROM (
    SELECT CAST(SUBSTRING(columname, 0, 4) AS UNSIGNED) as year, CAST(SUBSTRING(columname FROM 6) AS UNSIGNED) as value FROM tablename
) total
ORDER BY year DESC, value DESC
LIMIT 1;

如果ColumnName遵循该模式YEAR/0000,则可以使用MySQL中的SUBSTRING函数删除不需要的字符串部分

SELECT value FROM (
    SELECT CAST(SUBSTRING(columname, 0, 4) AS UNSIGNED) as year, CAST(SUBSTRING(columname FROM 6) AS UNSIGNED) as value FROM tablename
) total
ORDER BY year DESC, value DESC
LIMIT 1;

您需要将字符串分成两部分,并将其作为数字而不是字符串进行计算。以下公式将返回字段名中
/
后面的数字。下面使用的所有函数都在MySQL文档的一节中介绍。通过这种方式,您可以获得
/
字符后面的数字,即使它不是
/
字符前面的一年,而是其他年份。
+0
将字符串转换为数字,消除任何前导0

select right(columnname, char_length(columnname)-locate('/',columnname)) + 0
from tablename
只需获取上述表达式的max()即可获得预期结果

更新:

如果需要原始编号,且结果必须限制在特定年份,则需要将结果合并回原始表:

select columnname
from tablename t1
inner join (select max(right(t.columnname, char_length(t.columnname)-locate('/',t.columnname)) + 0) as max_num
            from tablename t
            where left(t.columnname,4)='2016'
           ) t2
           on right(t1.columnname, char_length(1t.columnname)-locate('/',t1.columnname)) + 0 = t2.max_num
where left(t1.columnname,4)='2016'

您需要将字符串分成两部分,并将其作为数字而不是字符串进行计算。以下公式将返回字段名中
/
后面的数字。下面使用的所有函数都在MySQL文档的一节中介绍。通过这种方式,您可以获得
/
字符后面的数字,即使它不是
/
字符前面的一年,而是其他年份。
+0
将字符串转换为数字,消除任何前导0

select right(columnname, char_length(columnname)-locate('/',columnname)) + 0
from tablename
只需获取上述表达式的max()即可获得预期结果

更新:

如果需要原始编号,且结果必须限制在特定年份,则需要将结果合并回原始表:

select columnname
from tablename t1
inner join (select max(right(t.columnname, char_length(t.columnname)-locate('/',t.columnname)) + 0) as max_num
            from tablename t
            where left(t.columnname,4)='2016'
           ) t2
           on right(t1.columnname, char_length(1t.columnname)-locate('/',t1.columnname)) + 0 = t2.max_num
where left(t1.columnname,4)='2016'
试着这样做:

SELECT 
    MAX(CAST(SUBSTRING(t.name,
            LOCATE('/', t.name) + 1)
        AS UNSIGNED)) AS max_value
FROM
    tablename AS t;
试着这样做:

SELECT 
    MAX(CAST(SUBSTRING(t.name,
            LOCATE('/', t.name) + 1)
        AS UNSIGNED)) AS max_value
FROM
    tablename AS t;

你可以尝试一下这个丑陋的小方法:

    SELECT t.id, t2.secondNumber FROM table AS t
    JOIN (SELECT id, 
                 CONCAT(SUBSTRING(field,1,5),
                   if(SUBSTRING(SUBSTRING(field, 6),1,1)='0', 
                      SUBSTRING(field, 6),
                      SUBSTRING(field,7)
                   )
                 ) as secondNumber FROM table ) AS t2 ON t2.id=t.id
    ORDER BY t2.secondNumber DESC
仅当第二个数字(斜杠后)前的0(零)不大于1时才有效

或者如果年份不重要,如果可以的话,你可以试着按第二个号码订购:

SELECT t.id, t2.secondNumber FROM table AS t
JOIN (SELECT id, 
               if(SUBSTRING(SUBSTRING(field, 6),1,1)='0', 
                  SUBSTRING(field, 6),
                  SUBSTRING(field,7)
               ) as secondNumber FROM table ) AS t2 ON t2.id=t.id
ORDER BY t2.secondNumber DESC

你可以尝试一下这个丑陋的小方法:

    SELECT t.id, t2.secondNumber FROM table AS t
    JOIN (SELECT id, 
                 CONCAT(SUBSTRING(field,1,5),
                   if(SUBSTRING(SUBSTRING(field, 6),1,1)='0', 
                      SUBSTRING(field, 6),
                      SUBSTRING(field,7)
                   )
                 ) as secondNumber FROM table ) AS t2 ON t2.id=t.id
    ORDER BY t2.secondNumber DESC
仅当第二个数字(斜杠后)前的0(零)不大于1时才有效

或者如果年份不重要,如果可以的话,你可以试着按第二个号码订购:

SELECT t.id, t2.secondNumber FROM table AS t
JOIN (SELECT id, 
               if(SUBSTRING(SUBSTRING(field, 6),1,1)='0', 
                  SUBSTRING(field, 6),
                  SUBSTRING(field,7)
               ) as secondNumber FROM table ) AS t2 ON t2.id=t.id
ORDER BY t2.secondNumber DESC

已经有很多建议作为答案给出了。但在我看来,其中一些似乎有些过分了

似乎OP查询所需的唯一更改是
orderby
子句中的表达式

而不是:

 ORDER BY id
我们只需要按斜杠后面的数值排序。有几种方法,几种表达式,可以从示例数据中得到

因为查询已经包含一个条件
列名,如“2016/%”

我们可以获得前五个字符之后的字符,然后通过加零将该字符串转换为数值

 ORDER BY SUBSTRING(columname,6) + 0 DESC
如果我们只想返回一行,请添加

 LIMIT 1

如果我们只想返回数值,那么除了columnname之外,还可以在SELECT列表中使用相同的表达式


这不是唯一的方法。还有很多其他方法可以使用,但不使用子字符串。

已经有很多建议作为答案给出了。但在我看来,其中一些似乎有些过分了

似乎OP查询所需的唯一更改是
orderby
子句中的表达式

而不是:

 ORDER BY id
我们只需要按斜杠后面的数值排序。有几种方法,几种表达式,可以从示例数据中得到

因为查询已经包含一个条件
列名,如“2016/%”

我们可以获得前五个字符之后的字符,然后通过加零将该字符串转换为数值

 ORDER BY SUBSTRING(columname,6) + 0 DESC
如果我们只想返回一行,请添加

 LIMIT 1

如果我们只想返回数值,那么除了columnname之外,还可以在SELECT列表中使用相同的表达式


这不是唯一的方法。还有很多其他方法可以使用,但不使用子字符串。

您是说要删除
/
,将结果转换为数字,然后找到它们的
最大值
?我需要这个“2016/0470”记录。因为这是斜杠后的最大数字,所以您保证在每条记录中都有斜杠?如果是这样,它是否总是位于第5位?只需执行@PM77-1 sad的操作:
从tablename中选择MAX(替换(列名“/”,”)
@PM77-1和karacsi_maci,领先的0在这里可能是个问题,如果你有
2016/0422
2016/470
,结果是
20160422
2016470
你是说你想删除
,将结果转换为数字,然后找到他们的
MAX
?我需要这个“2016/0470”记录。因为这是斜杠后的最大数字,所以您保证在每条记录中都有斜杠?如果是这样,它是否总是位于第5位?只需执行@PM77-1 sad的操作:
从tablename中选择MAX(替换(列名“/”,”)
@PM77-1和karacsi_maci,领先的0在这里可能是个问题,如果你有
2016/0422
2016/470
,结果是
20160422
2016470
你需要
CAST
/code>转换成一个数字,否则“0740”将不会是最大值。刚才正在考虑这个问题。编辑。谢谢你的回复。我正在寻找“2016/”之后的最大数字@Developer我将答案更新为f