【问题标题】:Find Max in String value in Mysql在 Mysql 中查找字符串值中的最大值
【发布时间】:2015-04-26 00:19:16
【问题描述】:

我有一个 mysql 表,其中包含 id、名称、文件路径、created_by、created_on 等字段。

在表格中,我必须通过 id 找到 max(file_path) 组。

例如,我将 file_path 作为

TTE_RODRIGUEZ_100001_246_6.pdf,
TTE_RODRIGUEZ_100001_246_7.pdf,
TTE_RODRIGUEZ_100001_246_8.pdf,
TTE_RODRIGUEZ_100001_246_9.pdf,
TTE_RODRIGUEZ_100001_246_10.pdf

id 为 1。

如果我运行查询

select max(file_path) from table where id='1'

它将值显示为TTE_RODRIGUEZ_100001_246_9.pdf 而不是TTE_RODRIGUEZ_100001_246_10.pdf,因为它将其作为字符串进行比较。

我试过了

SELECT CAST(SUBSTRING_INDEX(file_path, '_', -3)  AS SIGNED) as num FROM `table`

但结果显示为 0。

请大家帮帮我。

【问题讨论】:

  • 所以将文件名存储为06,07,08,09,10等
  • 我需要保存文件夹中的文件名。
  • 我认真地认为你应该修改你的文件命名策略。你让这件事变得比需要的更难。

标签: mysql casting max


【解决方案1】:

假设文件路径的第一部分对于给定的 id 是相同的,您希望以正确的顺序获取内容。

select file_path
from table
where id = '1'
order by (substring_index(file_path, '_', -1) + 0) desc
limit 1;

请注意,您的 substring_index() 表达式使用 -3,而这使用 -1。在第一个示例中,substring_index() 将返回“1.pdf”。 + 0 进行静默转换,因此它将转换前导数字并且不返回错误——在这种情况下给出“1”。

【讨论】:

  • 上述解决方案工作正常,但我必须使用 Inner Join 将其与另一个查询一起使用。我该怎么做。 "select o.order_id,o.order_details,max(f.file_path) from order o inner join filetable f on f.id=o.order_id"。我需要使用这些类型的案例。
  • @rekhas 。 . .对我来说,这听起来像是一个不同的问题。
【解决方案2】:

您只能使用substring()选择累进号码

SUBSTRING('TTE_RODRIGUEZ_100001_246_10.pdf', 25, 2) --10

您应该重命名文件并添加一个零,例如 07、08 等。

查询将是

SELECT MAX(SUBSTRING(file_path, 26, 2))
FROM table
WHERE id = '1'

编辑: 鉴于文件名可能会更改,并且唯一确定的是它以 .pdf 结尾,因此您必须使用如下负数:

SELECT MAX(SUBSTRING(file_path, -5, 2))
FROM table
WHERE id = '1'

【讨论】:

  • 名称 (TTE_RODRIGUEZ_100001_246) 不是静态的。可能是 TTE_ELIZABETH_101_22 之类的。所以您的解决方案无法满足我的要求。
  • 你说得对,我应该使用负数(从文件名末尾开始)。我会编辑我的答案
  • 目前无法测试(我正在使用 SQL Server),但我关注了链接页面,只有长度必须为正。我会再次编辑我的答案,对不起:D
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多