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