Я хочу разделить каждую отдельную строку на две строки в mysql (я хочу разделить num1 и num2 на две строки запятой). Мои данные такие:
datetime1 count num1 num2
2022-03-16 03:00:00 0 0,1 1,2
2022-03-16 04:00:00 0 0,1 1,2
и теперь мне нужны такие данные:
datetime1 count num1 num2
2022-03-16 03:00:00 0 0 1
2022-03-16 03:00:00 0 0 2
2022-03-16 03:00:00 0 1 1
2022-03-16 03:00:00 0 1 2
2022-03-16 04:00:00 0 0 1
2022-03-16 04:00:00 0 0 2
2022-03-16 04:00:00 0 1 1
2022-03-16 04:00:00 0 1 2
Всегда ли ровно два числа в num1 и num2? Если нет, вам понадобится рекурсивный запрос для создания строк.
Здесь мы можем использовать подход перекрестного/внутреннего соединения с помощью SUBSTRING_INDEX()
:
SELECT
t1.datetime1,
t1.count,
t1.num1,
t2.num2
FROM
(
SELECT datetime1, count, SUBSTRING_INDEX(num1, ',', 1) AS num1
FROM yourTable
UNION ALL
SELECT datetime1, count, SUBSTRING_INDEX(num1, ',', -1)
FROM yourTable
) t1
INNER JOIN
(
SELECT datetime1, count, SUBSTRING_INDEX(num2, ',', 1) AS num2
FROM yourTable
UNION ALL
SELECT datetime1, count, SUBSTRING_INDEX(num2, ',', -1)
FROM yourTable
) t2
ON t2.datetime1 = t1.datetime1
ORDER BY
t1.datetime1,
t1.num1,
t2.num2;
Начиная с версии 8+ MySql поддерживает LATERAL
select t.datetime1, t.count, n1.num1, n2.num2
from tbl t
cross join lateral (
select SUBSTRING_INDEX(t.num1, ',', 1) AS num1
UNION ALL
select SUBSTRING_INDEX(t.num1, ',', -1)
) n1
cross join lateral (
select SUBSTRING_INDEX(t.num2, ',', 1) AS num2
UNION ALL
select SUBSTRING_INDEX(t.num2, ',', -1)
) n2
Вы не должны хранить данные в этой форме в первую очередь. Ваша таблица нарушает нормализацию базы данных (NF1). Если вас интересуют отдельные значения, сохраните их отдельно. Результат вашего запроса — это то, как должна выглядеть исходная таблица.