Php 如何从带有字母数字字符串的列中获取最大值?

Php 如何从带有字母数字字符串的列中获取最大值?,php,mysql,casting,substr,Php,Mysql,Casting,Substr,我有一个包含发票和估价编号的表格。发票编号如“1000”、“1001”、“1002”等。估价编号如“ES101”、“ES102”、“ES103”。如何获得发票和估价的最大值?我还想把它转换成一个像1000这样的整数 我尝试了以下查询: SELECT Max(CAST (SUBSTR(invoiceNo,3) AS UNSIGNED)) FROM selected_items WHERE invoiceNo RLIKE 'IN'; 运行此查询时,出现以下错误: #1064-您的SQL语法有错误

我有一个包含发票和估价编号的表格。发票编号如
“1000”、“1001”、“1002”
等。估价编号如
“ES101”、“ES102”、“ES103”
。如何获得发票和估价的最大值?我还想把它转换成一个像1000这样的整数

我尝试了以下查询:

SELECT Max(CAST (SUBSTR(invoiceNo,3) AS UNSIGNED)) FROM selected_items 
WHERE invoiceNo RLIKE 'IN';
运行此查询时,出现以下错误:

#1064-您的SQL语法有错误;检查手册 对应于您的MySQL服务器版本,以便使用正确的语法 位于“”中发票号类似“”的选定_项的“UNSIGNED”)附近 第1行

我使用类似的方法进行估算:

SELECT Max(CAST (SUBSTR(invoiceNo,3) AS UNSIGNED)) FROM selected_items
WHERE invoiceNo RLIKE 'ES';

如何在一个查询中执行这两个操作?非常感谢您的帮助。谢谢。

我相信您的
invoiceNo
列中有一些额外的字符,即使在您使用
SUBSTR()
后仍然存在。这会导致
转换失败,因为非数字字符仍然存在。如果这些额外字符是空白,则
TRIM()
函数可能会派上用场:

SELECT MAX(CAST(SUBSTR(TRIM(invoiceNo),3) AS UNSIGNED))
FROM selected_items 
WHERE invoiceNo RLIKE 'IN'
正如@Tah所指出的,这里有一个链接可以帮助您删除所有字母数字字符,如果是这样的话:

更新:

如果您想在一个查询中获得两个最大值,一种方法是对您提到的两个查询进行
并集

SELECT 'invoiceMax', MAX(CAST(SUBSTR(TRIM(invoiceNo),3) AS UNSIGNED))
FROM selected_items 
WHERE invoiceNo RLIKE 'IN'
UNION
SELECT 'estimateMax', MAX(CAST(SUBSTR(TRIM(invoiceNo),3) AS UNSIGNED))
FROM selected_items 
WHERE invoiceNo RLIKE 'ES'

您可以使用条件聚合组合查询:

select
    max(case when invoiceNo rlike 'IN' then (your value here) end) maxIn,
    max(case when invoiceNo like 'ES' then (your value here) end) maxEs
from selected_items
where invoiceNo rlike 'IN'
or invoiceNo like 'ES'
另一种方法是使用子查询。我不确定哪一个运行得更快,所以您可能想同时测试这两个

select
    (your in query) as maxIn,
    (your en query) as maxEn

根据@FuzzyTree和@TimBiegeleisen的建议,您可以尝试以下查询

Select (SELECT MAX(CAST(SUBSTR(TRIM(invoiceNo),3) AS UNSIGNED))
FROM selected_items 
WHERE invoiceNo RLIKE 'IN') as maxIN,
(SELECT MAX(CAST(SUBSTR(TRIM(invoiceNo),3) AS UNSIGNED))
FROM selected_items 
WHERE invoiceNo RLIKE 'ES') as maxES;

感谢编辑@FelixPamittan,你能帮我找到解决方案吗?不,我只看到这个问题,因为它出现在我跟随的标记下。我怀疑你的
invoiceNo
列中可能有一些额外的字符。这就是
CAST
失败的原因。你能给我们看一些样本数据吗?没问题,谢谢@AaronBertrandI,我建议你去掉字母字符。看看这篇帖子吧,这是可行的,但是我如何才能在不写新查询的情况下对“ES”做同样的事情。非常感谢Tim:)非常感谢@Fuzzytree:)非常感谢@anup:)你能给你的代码添加一些解释,让其他人可以从中学习吗?此外,您能否解释一下,为什么要将PHP代码引入一个已经用纯MySQL查询多次回答的问题?
// get max index value   codeinigter
        $res = $this->db->get($table)->result();
        $arr = array();
        foreach ($res as $val) {
            $str = preg_replace('/\D/', '', $val->id);
            $arr[] = $str;
        }
        $or = max($arr) + 1;