OPDATERET Du kan gøre det med SQL på denne måde
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
- Underforespørgslen med et alias på n genererer i farten en sekvens af tal (tal eller taltabel) fra 1 til 100 i dette særlige tilfælde ved hjælp af
UNION ALL
ogCROSS JOIN
. Nogle gange er det praktisk at have en rigtig optællingstabel i din db . - I ydre vælg inderste
SUBSTRING_INDEX()
henter alt op til n'te element i en liste og ydreSUBSTRING_INDEX()
udtræk højre det meste efter en sidste afgrænsning, der effektivt får selve n-te element. CROSS JOIN
giver os mulighed for at producere et sæt rækker, som er et kartesisk produkt (på 100 rækker i n og alle rækker i eligibility_table)- tilstand i
WHERE
klausul filtrerer alle unødvendige rækker fra resultatsættet
Bemærk:denne forespørgsel vil opdele op til 100 filial-id'er. Hvis du har brug for mere eller mindre, kan du justere en grænse ved at redigere den indre underforespørgsel
Resultat i branch_table:
| ID | BRANCH_ID |------------------------| 1 | 621 || 1 | 622 || 1 | 623 || 1 | 625 || 2 | 621 || 2 | 650 |
Her er SQLFiddle demo