Możesz to zrobić za pomocą czystego SQL w ten sposób
SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(t.values, ',', n.n), ',', -1) value
FROM table1 t 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(t.values) - LENGTH(REPLACE(t.values, ',', '')))
ORDER BY value
Uwaga: Sztuczka polega na wykorzystaniu tabeli tally(numbers) i bardzo przydatnej w tym przypadku funkcji MySQL SUBSTRING_INDEX()
. Jeśli wykonujesz wiele takich zapytań (podział), możesz rozważyć wypełnienie i użycie utrwalonej tabeli zestawień zamiast generowania jej w locie za pomocą podzapytania, jak w tym przykładzie. Podzapytanie w tym przykładzie generuje sekwencję liczb od 1 do 100, co pozwala efektywnie podzielić do 100 wartości rozdzielanych na wiersz w tabeli źródłowej. Jeśli potrzebujesz więcej lub mniej, możesz to łatwo dostosować.
Wyjście:
| VALUE | |----------------| | somethingA | | somethingB | | somethingC | | somethingElseA | | somethingElseB |
Oto SQLFiddle demo
Tak może wyglądać zapytanie z utrwaloną tabelą zestawień
SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(t.values, ',', n.n), ',', -1) value
FROM table1 t CROSS JOIN tally n
WHERE n.n <= 1 + (LENGTH(t.values) - LENGTH(REPLACE(t.values, ',', '')))
ORDER BY value
Oto SQLFiddle demo