好的,这是一个我以前从未见过的奇怪的人。您将要看到的脚本位从表中获取值,将其展开然后增加存储在数组中的数字,这样我就可以使用它来创建唯一的产品代码。但是,一旦达到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['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;
表本身将custom_id列设置为varchar(100)。
任何帮助表示感谢。
答案 0 :(得分:4)
问题出在您的查询中。
ORDER BY custom_id DESC
因为(遗憾地命名的)custom_id
列是字符类型,所以此值为:
SJS/CUSTOM/9
将按此顺序排列(按降序排列):
SJS/CUSTOM/10
因为比较是角色的特征。 '9'
大于'1'
。作为人类,我们可能会认为 10 大于 9 。但MySQL只是在比较角色和角色。如果我们在'0'
之前添加了'9'
字符,那么数据库正在将'09'
与'10'
进行比较,我们就会更接近获得我们期望的结果。
如果custom_id
的值总是包含两个正斜杠,并且您想要在最后一个正斜杠之后的数值,则可以使用SQL表达式解析它
SUBSTRING_INDEX(custom_id,'/',-1)+0
(添加一个零将字符串转换为数字值.MySQL以它的方式运行,它不会抛出错误,它会尽可能地将前导部分转换为数字。
如果总是有两个斜杠,你可以在第二个斜杠之前使用表达式获取该部分:
SUBSTRING_INDEX(custom_id,'/',2)
要获得“最大”值,您可以这样做......
ORDER
BY SUBSTRING_INDEX(custom_id,'/',2) DESC
, SUBSTRING_INDEX(custom_id,'/',-1)+0 DESC
LIMIT 1
注意:只要custom_id
始终包含两个正斜杠,此“有效”。如果custom_id
的任何值不是那样的,那么这些表达式的行为定义得很好,但不太可能返回你想要的结果。
MySQL无法有效利用索引来满足此查询;这些表达式需要针对表中的每个行进行评估。如果你坚持这种不幸的设计,那么你就会坚持下去。我们希望将这些表达式的结果分别存储在两个单独的列中。