无法将数字增加到10以上

时间:2015-05-04 20:04:17

标签: 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['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)。

任何帮助表示感谢。

1 个答案:

答案 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无法有效利用索引来满足此查询;这些表达式需要针对表中的每个行进行评估。如果你坚持这种不幸的设计,那么你就会坚持下去。我们希望将这些表达式的结果分别存储在两个单独的列中。