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