gpt4 book ai didi

php - MySQL 查询跳过 001 数字

转载 作者:行者123 更新时间:2023-11-29 06:51:44 26 4
gpt4 key购买 nike

这是我之前的问题的后续问题,已在此处得到解答 - Determine the next number in database query with while loop in php

如果我有一个产品选项卡

products TABLE
==============
ABC001
ABC002
ABC003
ABC005
==============

并使用这个

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

我得到的结果是4。但是如果我有表格看起来

products TABLE
==============
ABC005
ABC006
ABC007
ABC008
==============

它给我的结果是9。如果表中没有,则结果为 2 而不是 1。如果我添加 ABC001 ,它就可以正常工作。为什么会这样?有没有办法修复它,以便它也选择 1?如果没有 ABC001 ,我怎样才能让它正常工作?

谢谢!

最佳答案

如果我理解正确,您想要第一个未使用的“ABCnnn”。因此,如果“ABC001”仍然可用,请获取此信息,否则尝试“ABC002”,依此类推。

一种方法是创建从“ABC001”到“ABC999”的所有代码,然后删除表中已有的代码。从这些中取出最少的一个。

您可以使用任何方法来生成号码,甚至可以使用一个包含所有允许的代码的表格。这里我使用二进制数学来创建数字:

select min(code) as new_code
from
(
select concat('ABC', lpad(num,3,'0')) as code
from
(
select a.x + b.x * 2 + c.x * 4 + d.x * 8 + e.x * 16 + f.x * 32 +
g.x * 64 + h.x * 128 + i.x * 256 + j.x * 512 as num
from (select 0 as x union all select 1) a
cross join (select 0 as x union all select 1) b
cross join (select 0 as x union all select 1) c
cross join (select 0 as x union all select 1) d
cross join (select 0 as x union all select 1) e
cross join (select 0 as x union all select 1) f
cross join (select 0 as x union all select 1) g
cross join (select 0 as x union all select 1) h
cross join (select 0 as x union all select 1) i
cross join (select 0 as x union all select 1) j
) numbers
where num between 1 and 999
) codes
where code not in (select id from products);

除此之外,我还会修复糟糕的数据库设计。将“ABC”与号码分开存储。如果它始终是“ABC”,则根本不存储该字符串。

关于php - MySQL 查询跳过 001 数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47160819/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com