Как разбить одну строку на несколько строк в mysql

Я хочу разделить каждую отдельную строку на две строки в 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

Вы не должны хранить данные в этой форме в первую очередь. Ваша таблица нарушает нормализацию базы данных (NF1). Если вас интересуют отдельные значения, сохраните их отдельно. Результат вашего запроса — это то, как должна выглядеть исходная таблица.

Thorsten Kettner 21.03.2022 08:06

Всегда ли ровно два числа в num1 и num2? Если нет, вам понадобится рекурсивный запрос для создания строк.

Thorsten Kettner 21.03.2022 08:11
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
0
2
70
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Здесь мы можем использовать подход перекрестного/внутреннего соединения с помощью 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;

screen capture from demo link below

Демо

Начиная с версии 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

дб <> рабочий пример

Другие вопросы по теме