我有一个部分管理系统,我用PHP在MySQL中创建。我正在尝试创建的东西将为我生成下一个零件编号。所有部件号均以3个字母前缀(由产品系列/类别确定)开头,后跟其编号。
例如'ABC001'
我在下面的内容是我想用来确定下一个数字已经是'ABC001','ABC002'和& 'ABC003'所以我希望通过查询来识别下一个数字是什么,直到查询返回false,因为该产品编号尚不存在。
$abc_query = "SELECT * FROM products WHERE id LIKE 'ABC%'";
$abc_result = $mysqli2->query($abc_query);
while($row = $abc_result->fetch_assoc()) {
$rowid = $row["id"];
$pnumber = substr($rowid, 3, 3);
echo $pnumber. '<br/>';
$int = (int)$pnumber;
$abc_query2 = "SELECT * FROM products WHERE id 'ABC" . sprintf('%03s', $int);
for ($abc_query2 = true; $abc_query2 = false; $int++){
echo $int;
}$abc_nextnumber = $int +1;
}
$abc_newnumber = 'ABC' . sprintf('%03s', $abc_nextnumber);
echo $abc_newnumber;
我得到的结果是
001
002
003
005
ABC006
然而结果应该是..
001
002
003
ABC004
代码更新我已经更新了代码,但如果我有005,它似乎不会停在ABC004。它将转到006。
答案 0 :(得分:4)
您应该让db执行此操作而不是您的应用程序:
select t.id_prfx, max(t.id_num) as latest_num from
(select substring(id, 1, 3) as id_prfx,
cast(substring(id,4) as integer) as id_num) t
group by id_prfx
这将为您提供一个结果表,您可以在其中获得每个前缀的最高部件号。
如果你真的只想要&#39; ABC&#39;的前缀然后:
select max(cast(substring(id,4) as integer)) as max_num from table
where id LIKE 'ABC%'
答案 1 :(得分:3)
如果有人知道如何让它在查询中添加自动零(因为一旦到达&#39; ABC011&#39;它将是不同数量的0)而不是输入它们也将是非常有帮助。
以下是如何自动处理前置零。
$sql3 = "SELECT * FROM products WHERE id 'ABC" . sprintf('%03s', $int);
答案 2 :(得分:3)
你可以尝试这个查询吗?
SELECT MAX(SUBSTR(id,4))as last_id FROM products WHERE SUBSTR(id,1,3)='ABC'
修改强>
products TABLE
==============
ABC001
ABC002
ABC003
ABC005
==============
我们希望在产品表中找到 4 。
SELECT SUBSTR(t1.id, 4) + 1 as POSSIBLE_MIN_ID
FROM products t1
WHERE NOT EXISTS (
SELECT *
FROM products t2
WHERE SUBSTR(id, 1, 3)='ABC' AND SUBSTR(t2.id, 4) = SUBSTR(t1.id, 4) + 1
) LIMIT 1
<强>结果:强> POSSIBLE_MIN_ID:4