在php中使用while循环确定数据库查询中的下一个数字

时间:2017-10-25 19:03:46

标签: php mysql sql

我有一个部分管理系统,我用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。

3 个答案:

答案 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