Можете да го направите с чист SQL като този
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
Забележка: Номерът е да се използва таблица за изчисление (числа) и много удобна в този случай MySQL функция SUBSTRING_INDEX()
. Ако правите много такива заявки (разделяне), тогава може да помислите за попълване и използване на постоянна таблица за изчисление, вместо да я генерирате в движение с подзаявка, както в този пример. Подзаявката в този пример генерира поредица от числа от 1 до 100, което ефективно ви позволява да разделите до 100 ограничени стойности на ред в таблицата на източника. Ако имате нужда от повече или по-малко, можете лесно да го коригирате.
Изход:
<пред>| СТОЙНОСТ ||----------------|| нещоА || нещо B || нещоC || нещо другоA || нещо другоB |Ето SQLPiddle демонстрация
Ето как може да изглежда заявката с постоянна таблица за изчисление
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
Ето SQLPiddle демонстрация