Php 无法获取增量大于10的数字
好吧,这是一个我从未见过的奇怪的。您将要看到的脚本位从表中获取一个值,分解它,然后增加存储在数组中的数字,这样我就可以使用它创建唯一的产品代码。然而,这个数字一旦达到10就拒绝增加。以下是脚本:Php 无法获取增量大于10的数字,php,mysql,Php,Mysql,好吧,这是一个我从未见过的奇怪的。您将要看到的脚本位从表中获取一个值,分解它,然后增加存储在数组中的数字,这样我就可以使用它创建唯一的产品代码。然而,这个数字一旦达到10就拒绝增加。以下是脚本: $query = $this->mysqli_link->query("SELECT custom_id FROM sjs_custom_orders ORDER BY custom_id DESC LIMIT 1")->fetch_array(); $custom_id_old =
$query = $this->mysqli_link->query("SELECT custom_id FROM sjs_custom_orders ORDER BY custom_id DESC LIMIT 1")->fetch_array();
$custom_id_old = $query['custom_id'];
$custom_id_new_split = explode("/", $custom_id_old);
$custom_id = $custom_id_new_split[2] + 1;
$custom_id_new = "SJS/CUSTOM/" . $custom_id;
表本身的自定义_id列设置为varchar(100)
感谢您的帮助。问题在于您的查询
ORDER BY custom\u id DESC
由于(不幸命名)custom_id
列是字符类型,因此此值:
SJS/CUSTOM/9
SJS/CUSTOM/10
将在此值之前排序(按降序):
SJS/CUSTOM/9
SJS/CUSTOM/10
因为比较是一对一的。'9'
大于'1'
。作为人类,我们可能认为十大于九。但是MySQL只是在比较不同的字符。如果我们在'9'
之前添加一个'0'
字符,那么数据库将'09'
与'10'
进行比较,我们将更接近获得我们期望的结果
如果
custom_id
的值始终包含两个正斜杠,并且您希望数值位于最后一个正斜杠之后,则可以使用SQL表达式将其解析出来
SUBSTRING_INDEX(custom_id,'/',-1)+0
(Add a zero将字符串转换为数值。MySQL这样做很不可靠,它不会抛出错误,它会尽可能多地将前导部分转换为数值
如果始终有两条斜线,则还可以使用表达式获取第二条斜线之前的零件:
SUBSTRING_INDEX(custom_id,'/',2)
要获得“最大”值,您可以这样做
ORDER
BY SUBSTRING_INDEX(custom_id,'/',2) DESC
, SUBSTRING_INDEX(custom_id,'/',-1)+0 DESC
LIMIT 1
注意:只要custom\u id
始终包含两个正斜杠,此“操作”就有效。如果custom\u id
的任何值都不是这样,则这些表达式的行为定义良好,但不太可能返回您想要的结果
MySQL将无法有效地使用索引来满足此查询;需要对表中的每一行计算这些表达式。如果您被这种不幸的设计所困扰,那么您就被困在其中。我们希望看到这些表达式的结果分别存储在两个单独的列中。varchar问题。使用
int
问题是,自定义id是字母和数字的混合体。id不是PK,需要在客户端上创建。id中的文本在这里似乎非常冗余:您的表名是sjs\u custom\u orders
,您的id以sjs/custom/
开头。只需使用int
s即可。您不能用它来计算textok spencer将尝试一下,感谢您的帮助,感谢您的帮助,我们将尝试探索不同的方法,让代码在未来工作,而不必进行低效的查询:)再次感谢