Puedes hacerlo con SQL puro como este
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
Nota: El truco es aprovechar la tabla de conteo (números) y una función MySQL muy útil en este caso SUBSTRING_INDEX()
. Si realiza muchas de estas consultas (dividir), entonces podría considerar completar y usar una tabla de conteo persistente en lugar de generarla sobre la marcha con una subconsulta como en este ejemplo. La subconsulta de este ejemplo genera una secuencia de números del 1 al 100, lo que le permite dividir hasta 100 valores delimitados por fila en la tabla de origen. Si necesitas más o menos, puedes ajustarlo fácilmente.
Salida:
| VALUE | |----------------| | somethingA | | somethingB | | somethingC | | somethingElseA | | somethingElseB |
Aquí está SQLFiddle demostración
Así es como se vería la consulta con una tabla de conteo persistente
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
Aquí está SQLFiddle demostración