Определите следующий номер в запросе базы данных с циклом while в php

У меня есть система управления деталями, которую я создал в 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 

обновление кода Я обновил код, но, похоже, он не останавливается на ABC004, если у меня есть 005. Он перейдет к 006.

Не могли бы вы попробовать этот запрос?

SELECT MAX (SUBSTR (id, 4)) как 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

Вы должны использовать 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 

Это даст вам таблицу результатов, в которой вы получите наивысший номер детали для каждого префикса.

Если вам действительно нужны только префиксы «ABC», тогда:

 select max(cast(substring(id,4) as integer)) as max_num from table where id LIKE 'ABC%' 

Если кто-нибудь знает, как я могу добавить его в запрос в автоматические нули (так как это будет разное количество 0, как только оно дойдет до «ABC011»), вместо того, чтобы вводить их в это, также будет очень полезно.

Ниже описано, как автоматически обрабатывать добавленные нули.

  $sql3 = "SELECT * FROM products WHERE id 'ABC" . sprintf('%03s', $int);