mysql从字符串字段中获取最大数量

时间:2016-10-21 14:42:57

标签: mysql sql

我需要从值的一部分获得最大数量,该值通常以year开头,然后是斜杠(/)。所以我需要在斜杠(/)后面有一个最大数字,但是年份应该是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”作为最大数字?

任何帮助将不胜感激。

谢谢。

5 个答案:

答案 0 :(得分:3)

如果列名遵循该模式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;

答案 1 :(得分:1)

您需要将字符串拆分为2个部分并将其评估为数字,而不是字符串。以下公式将返回fieldname中/之后的数字。下面使用的所有函数都在MySQL文档的string functions部分中描述。通过这种方式,您可以获得/字符后的数字,即使它不是/之前的年份,也可以是sg。 + 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'

答案 2 :(得分:1)

已经有很多建议作为答案。但其中一些似乎对我来说太过分了。

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

而不是:

 ORDER BY id

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

由于查询已包含条件columname LIKE '2016/%'

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

 ORDER BY SUBSTRING(columname,6) + 0 DESC

如果我们只想返回一行,请添加

 LIMIT 1

http://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_substring

如果我们只想返回数值,我们可以在SELECT列表中使用相同的表达式,另外还有columnname。

这不是唯一的方法。还有很多其他方法可行,并且不使用SUBSTRING。

答案 3 :(得分:0)

试试这样:

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

答案 4 :(得分:0)

你可以试试这个小小的方法:

    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