Ответ 1
Вы можете сделать это с помощью чистого 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 значений с разделителями на строку в исходной таблице. Если вам нужно больше или меньше, вы можете легко его отрегулировать.
Вывод:
| VALUE | |----------------| | somethingA | | somethingB | | somethingC | | somethingElseA | | somethingElseB |
Вот SQLFiddle демо
Вот как выглядит запрос с сохраненной таблицей таблиц
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
Вот SQLFiddle демо