Я столкнулся с проблемой увеличения строки на 01, 02,..., 10, 12.
AAAA06, который является максимальным в моей базе данных.AAAA06 (максимально в настоящее время) и должен возвращать или печатать AAAA07.AAAA09, оно должно увеличиваться до AAAA10 и т. д.Мой запрос, который я использую, похож на
select max(code) from mt_users where maincode='AAAA'
Вызов максимального нет выполняется мной; Я просто хочу увеличить или объединить все, что подходит, чтобы получить результат желания.
Он возвращает мне AAAA06, так как в настоящее время это максимальный.
Важные точки
AAAA, он должен показывать AAAA01AAAA09, он должен показывать AAAA10.AAAA99, он покажет AAAA100Примечание: в настоящее время у меня максимум как AAAA06, но для нового пользователя в будущем это может быть AAAE, поэтому я должен начать с AAAE01.
@Ханнес это варчар
Кажется, у вас уже есть поле mainode (кстати, s означает «mainnode» или «maincode»?), которое содержит префикс «AAAA». Итак, вы не можете просто иметь числовое поле, которое автоматически увеличивается при доступе и возвращает конкатенацию обоих?
@ Томас, я не знаю, как этого добиться
Такого рода проблемы являются симптомом плохого (т. е. наоборот) дизайна.
@Strawberry, это дизайн БД, который кто-то сделал, теперь я должен добиться этого :(
@SalmanA, это AAAA99, а не AAA99 ....... он покажет AAAA100
@munish, тогда у вас возникнут проблемы с поиском максимального значения. SELECT MAX(s) FROM (SELECT 'AAAA100' s UNION SELECT 'AAAA21') x возвращает AAAA21!!!
@SalmanA нет при выборе max для AAAA100, он дает только AAAA100






Вы можете использовать lpad как
select case when code < 10
then concat( substring(maincode,1,4),lpad( max(code)+1 ,length(code+10),'0'))
else concat( substring(maincode,1,4),lpad( max(code)+1 ,length(code+1),'0'))
end
as "Result String"
from tab
where maincode = 'AAAA01' -- 'AAAE';
В зависимости от чата между нами вам понадобится следующая логика:
select concat( substring(maincode,1,4),
case when substring(maincode,5,length(maincode)-4) !=
substring(maincode,5,length(maincode)-4)+1
then
substring(maincode,5,length(maincode)-4)+1
else
lpad(
substring(maincode,5,length(maincode)-4)+1,
length(maincode)-4,'0')
end
)
as "Result String"
from tab;
эй, сэр, это дает неправильный результат, так как для AAAA06 это дает AAAA0601
@manishthakur ты уверен, дорогой друг, рассмотри демо, пожалуйста.
позвольте мне проверить сэр
эй, сэр, для AAAA он дает AAAA01, но для AAAA01 он дает ноль, так как в разделе where maincode=AAAA01 отображается ноль, вы можете проверить
та же проблема, сэр, дает AAAA1 вместо AAAA01, а для AAAA01 дает ноль
@manishthakur Хорошо, проблема решена. Можно попробовать с 0,1,..9,98,99,100......
сэр, все та же проблема, когда основной код передается как AAAA01, он показывает ноль :(
я думаю, что есть какое-то недоразумение
@manishthakur из текста вопроса я понимаю, что есть два отдельных столбца, называемых основной код и код, и мой ответ зависит от этой логики.
Краткий ответ - используйте этот запрос:
SELECT id AS PrevID, CONCAT(
SUBSTRING(id, 1, 4),
IF(CAST(SUBSTRING(id, 5) AS UNSIGNED) <= 9, '0', ''),
CAST(SUBSTRING(id, 5) AS UNSIGNED) + 1
) AS NextID
FROM (
-- since you allow strings such as AAAA20 and AAAA100 you can no longer use MAX
SELECT id
FROM t
ORDER BY SUBSTRING(id, 1, 4) DESC, CAST(SUBSTRING(id, 5) AS UNSIGNED) DESC
LIMIT 1
) x
Результаты:
| PrevID | NextID |
| AAAA100 | AAAA101 |
| AAAA21 | AAAA22 |
| AAAA06 | AAAA07 |
Ради интереса я написал эту хранимую процедуру, которая генерирует числа, которые выглядят как AAAA00 AAAA99 AAAB00 и т. д.:
CREATE FUNCTION NextID(PrevID VARCHAR(6))
RETURNS VARCHAR(6)
BEGIN
DECLARE s VARCHAR(4);
DECLARE i INT;
DECLARE j INT;
SET s = LEFT(PrevID, 4);
SET s = REPLACE(s, 'A', '0');
SET s = REPLACE(s, 'B', '1');
SET s = REPLACE(s, 'C', '2');
SET s = REPLACE(s, 'D', '3');
SET s = REPLACE(s, 'E', '4');
SET s = REPLACE(s, 'F', '5');
SET s = REPLACE(s, 'G', '6');
SET s = REPLACE(s, 'H', '7');
SET s = REPLACE(s, 'I', '8');
SET s = REPLACE(s, 'J', '9');
SET s = REPLACE(s, 'K', 'A');
SET s = REPLACE(s, 'L', 'B');
SET s = REPLACE(s, 'M', 'C');
SET s = REPLACE(s, 'N', 'D');
SET s = REPLACE(s, 'O', 'E');
SET s = REPLACE(s, 'P', 'F');
SET s = REPLACE(s, 'Q', 'G');
SET s = REPLACE(s, 'R', 'H');
SET s = REPLACE(s, 'S', 'I');
SET s = REPLACE(s, 'T', 'J');
SET s = REPLACE(s, 'U', 'K');
SET s = REPLACE(s, 'V', 'L');
SET s = REPLACE(s, 'W', 'M');
SET s = REPLACE(s, 'X', 'N');
SET s = REPLACE(s, 'Y', 'O');
SET s = REPLACE(s, 'Z', 'P');
SET i = RIGHT(PrevID, 2);
SET j = CONV(s, 26, 10);
SET i = i + 1;
IF i > 99 THEN
SET i = 0;
SET j = j + 1;
END IF;
SET s = CONV(j, 10, 26);
SET s = REPLACE(s, 'P', 'Z');
SET s = REPLACE(s, 'O', 'Y');
SET s = REPLACE(s, 'N', 'X');
SET s = REPLACE(s, 'M', 'W');
SET s = REPLACE(s, 'L', 'V');
SET s = REPLACE(s, 'K', 'U');
SET s = REPLACE(s, 'J', 'T');
SET s = REPLACE(s, 'I', 'S');
SET s = REPLACE(s, 'H', 'R');
SET s = REPLACE(s, 'G', 'Q');
SET s = REPLACE(s, 'F', 'P');
SET s = REPLACE(s, 'E', 'O');
SET s = REPLACE(s, 'D', 'N');
SET s = REPLACE(s, 'C', 'M');
SET s = REPLACE(s, 'B', 'L');
SET s = REPLACE(s, 'A', 'K');
SET s = REPLACE(s, '9', 'J');
SET s = REPLACE(s, '8', 'I');
SET s = REPLACE(s, '7', 'H');
SET s = REPLACE(s, '6', 'G');
SET s = REPLACE(s, '5', 'F');
SET s = REPLACE(s, '4', 'E');
SET s = REPLACE(s, '3', 'D');
SET s = REPLACE(s, '2', 'C');
SET s = REPLACE(s, '1', 'B');
SET s = REPLACE(s, '0', 'A');
RETURN CONCAT(LPAD(s, 4, 'A'), LPAD(i, 2, '0'));
END
SELECT NextID('AAAA01') -- AAAA02
SELECT NextID('AAAA99') -- AAAB00
SELECT NextID('AAAB99') -- AAAC00
SELECT NextID('AAAZ99') -- AABA00
id/PrevID — это столбец, содержащий строку. NextID — это «сгенерированный» идентификатор на основе предыдущего идентификатора (добавлен для демонстрации).
эй, когда будет BBBB, он собирается дать BBBB01?
эй, сэр, у меня очень маленькая проблема... когда вы будете свободны, прокомментируйте здесь
Каков тип данных этого поля в БД?