@sergeiy_permyakov

Как заполнить таблицу в цикле Mysql?

Как заполнить таблицу в цикле Mysql?
Есть таблица с записями
Поля:
product_attr_id, product_id, attr_7, attr_29
Пример записей:
product_attr_id=12286, product_id=2779, attr_7=461,attr_29= 1097
product_attr_id=12287, product_id=2779, attr_7=461,attr_29= 1098
product_attr_id=12288, product_id=2779, attr_7=461,attr_29= 1099

product_attr_id=12289, product_id=2779, attr_7=462,attr_29= 1097
product_attr_id=12290, product_id=2779, attr_7=462,attr_29= 1098
product_attr_id=12291, product_id=2779, attr_7=462,attr_29= 1099

product_attr_id=12292, product_id=2779, attr_7=463,attr_29= 1097
product_attr_id=12293, product_id=2779, attr_7=463,attr_29= 1098
product_attr_id=12294, product_id=2779, attr_7=463,attr_29= 1099


product_attr_id=12295, product_id=2779, attr_7=464,attr_29= 1097
product_attr_id=12297, product_id=2779, attr_7=464,attr_29= 1098
product_attr_id=12298, product_id=2779, attr_7=464,attr_29= 1099
...

product_attr_id=12321, product_id=2779, attr_7=474,attr_29= 1097
product_attr_id=12322, product_id=2779, attr_7=474,attr_29= 1098
product_attr_id=12323, product_id=2779, attr_7=474,attr_29= 1099

Как использовать тут while или loop? Или пример посмотреть как задать запрос чтобы заполнить следующие записи для продуктов с другим product_id и с такими повторениями? 
Получается надо заполнить 
attr_7=461 и attr_29=1097,
 attr_7=461 и attr_29=1098, 
attr_7=461 и attr_29=1099
далее 
attr_7=462 и attr_29=1097,  
attr_7=462 и attr_29=1098,  
attr_7=462 и attr_29=1099
и т.д. attr_7=463 и attr_29=1097,  attr_7=463 и attr_29=1098,  attr_7=463 и attr_29=1099
.........
attr_7=474 и attr_29=1097,  
attr_7=474 и attr_29=1098,  
attr_7=474 и attr_29=1099
  • Вопрос задан
  • 411 просмотров
Решения вопроса 1
erge
@erge
Примус починяю
т.к. вы не указали версию БД, то предлагаемое ниже решение написано в рамках 8+ версии
предполагаю что product_attr_id - это автоинкрементный PRIMARY KEY
В итого, все делается одним запросом и без циклов.
делаем две рекурсивные CTE (см. Recursive Common Table Expressions), реализуем в них "счетчики", объединяем их и получаем желаемое, далее дело техники, в итого получаем

INSERT INTO product_attr (attr_7, attr_29)
WITH RECURSIVE
  param AS
(
  SELECT
    461  AS attr_7_start,  -- начальное значение для attr_7
    10   AS attr_7_num,    -- количество итераций в attr_7
    1097 AS attr_29_start, -- начальное значение для attr_29
    3    AS attr_29_num    -- количество итераций в attr_29
),
  attr29_iter (n) AS
(
  SELECT 0
  UNION ALL
  SELECT n + 1 FROM attr29_iter, param WHERE n < attr_29_num -1
),
 attr_7_iter (n) AS
(
  SELECT 0
  UNION ALL
  SELECT n + 1 FROM attr_7_iter, param WHERE n < attr_7_num -1
),
  gen_inc AS
(
  SELECT i7.n as inc7, i29.n as inc29
    FROM attr_7_iter i7, attr29_iter i29
)
SELECT attr_7_start + inc7, attr_29_start + inc29
  FROM gen_inc, param
  ORDER BY 1,2
;


PS: для удобства, вынес так называемые параметры в отдельную CTEшку param

см. пример на dbfiddle

UPDATE:
для "прохода" по нескольким продуктам по их категориям, просто включаете таблицы product и category в общее объединение во внешнем запросе SELECT

INSERT INTO product_attr (product_id, product_price, product_old_price, attr_7, attr_29)
WITH RECURSIVE
  param AS
(
  SELECT
    461  AS attr_7_start,  -- начальное значение для attr_7
    14   AS attr_7_num,    -- количество итераций в attr_7
    1097 AS attr_29_start, -- начальное значение для attr_29
    3    AS attr_29_num    -- количество итераций в attr_29
),
  attr29_iter (n) AS
(
  SELECT 0
  UNION ALL
  SELECT n + 1 FROM attr29_iter, param WHERE n < attr_29_num -1
),
 attr_7_iter (n) AS
(
  SELECT 0
  UNION ALL
  SELECT n + 1 FROM attr_7_iter, param WHERE n < attr_7_num -1
),
  gen_inc AS
(
  SELECT i7.n as inc7, i29.n as inc29
    FROM attr_7_iter i7, attr29_iter i29
)
SELECT p.product_id, p.product_price, p.product_old_price, attr_7_start + inc7 AS attr_7, attr_29_start + inc29 AS attr_29
  FROM gen_inc, param, product p, category c
  WHERE p.product_id = c.product_id
    AND c.category_id NOT IN (214, 221, 220, 217, 216, 215, 48, 42, 40, 45, 46, 44, 50, 41, 43, 31, 178, 89, 47, 179, 177, 120, 121, 59, 58, 32, 37, 56, 53, 54, 55, 29, 28, 30, 176, 237, 113, 116, 175, 114, 196, 195, 197, 218, 219, 33, 93, 92, 91, 81, 90)
  ORDER BY 1, 4, 5
;


см. пример на dbfiddle
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@rPman
Дано:
product_attr_id - растет непрерывно по 1
attr_7 - растет по 1 через три
attr_29 - растет по 1 но через 3 записи (или при превышении 1099) возвращается к 1097

итого:

делаем один единый цикл по product_attr_id - for ... step 1
увеличиваем attr_29 на 1 каждый шаг и проверяем выход за границу >1099 присваиваем 1097, так же в этот момент увеличиваем attr_7 на 1
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы