MySQL / 11. Формирование и использование последовательностей

Формирование повторяющихся последовательностей

Задача
Вам нужно создать последовательность, которая содержит циклы.

Решение
Сформируйте последовательность и получите циклические элементы, используя операторы деления и деления по модулю.

Обсуждение
В некоторых задачах формирования последовательностей требуются значения, повторяющиеся циклически. Предположим, что вы выпускаете, например, фармацевтические товары или детали для автомобилей, и вам необходимо отслеживать их по номеру партии на тот случай, если будут выявлены проблемы производства, требующие отзыва изделий этой партии. Предположим также, что вы упаковываете по 12 изделий (unit) в коробку (box) и по 6 коробок в ящик (case). В этом случае идентификатор изделия состоит из трех частей: номер изделия (от 1 до 12), номер коробки (от 1 до 6) и номер партии (со значением от 1 до наибольшего текущего номера ящика).

Задача отслеживания изделий, похоже, требует хранения трех счетчиков, так что можно предложить такой алгоритм формирования следующего идентификатора: получить последние использованные номера партии, коробки и изделия

unit = unit + 1 # увеличить номер изделия
if (unit > 12) # начать новую коробку?
{
unit = 1 # перейти к первому изделию следующей коробки
box = box + 1
}
if (box > 6) # начать новый ящик?
{
box = 1 # перейти к первой коробке следующего ящика
case = case + 1
}

сохранить полученные номера партии, коробки и изделияДействительно, можно действовать по этому алгоритму. А можно просто присваивать каждому элементу идентификатор последовательности (seq) и извлекать из него соответствующие номера ящика, коробки и изделия.

Идентификатор можно получать из столбца AUTO_INCREMENT или от генератора однострочной последовательности. Формулы определения номера ящика, номера коробки и номера изделия для любого изделия по его номеру последовательности таковы:

unit = ((seq - 1) % 12) + 1
box = (int ((seq - 1) / 12) % 6) + 1
case = int ((seq - 1)/(6 * 12)) + 1

Приведенная ниже таблица иллюстрирует связь между номерами последовательности и соответствующими номерами ящика, коробки и изделия:

seq case box unit
1 1 1 1
12 1 1 12
13 1 2 1
72 1 6 12
73 2 1 1
144 2 6 12

Статьи по MySQL на эту тему:

Последовательная нумерация строк вывода запроса