АКТУАЛИЗИРАНО Можете да го направите с SQL по този начин
INSERT INTO branch_table (id, branch_id)
SELECT e.id, SUBSTRING_INDEX(SUBSTRING_INDEX(e.branch_ids, ',', n.n), ',', -1) branch_id
FROM eligibility_table e CROSS JOIN
(
SELECT a.N + b.N * 10 + 1 n
FROM
(SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) a
,(SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) b
ORDER BY n
) n
WHERE n.n <= 1 + (LENGTH(e.branch_ids) - LENGTH(REPLACE(e.branch_ids, ',', '')))
ORDER BY id, branch_id
- Подзаявката с псевдоним на n генерира в движение поредица от числа (числа или таблица за преброяване) от 1 до 100 в този конкретен случай с помощта на
UNION ALL
иCROSS JOIN
. Понякога е удобно да имате истинска таблица за преброяване във вашата база данни . - Във външния изберете най-вътрешния
SUBSTRING_INDEX()
получава всичко до n-тия елемент в списъка и външнияSUBSTRING_INDEX()
извлича по-голямата част отдясно след последния разделител, като ефективно получава самия n-ти елемент. CROSS JOIN
ни позволява да създадем набор от редове, който е декартово произведение (от 100 реда в n и всички редове в eligibility_table)- условие в
WHERE
клауза филтрира всички ненужни редове от набора с резултати
Забележка:тази заявка ще раздели до 100 идентификатора на клонове. Ако имате нужда от повече или по-малко, можете да коригирате ограничение, като редактирате вътрешната подзаявка
Резултат в branch_table:
<преди>| ID | BRANCH_ID |------------------| 1 | 621 || 1 | 622 || 1 | 623 || 1 | 625 || 2 | 621 || 2 | 650 |Ето го SQLFiddle демонстрация