我需要从值的一部分获得最大数量,该值通常以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”作为最大数字?
任何帮助将不胜感激。
谢谢。
答案 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