MySQL преобразует схему таблиц, сохраняя данные в новой структуре (лучшая схема, которую вы когда-либо видели) - PullRequest
0 голосов
/ 13 октября 2018

Я разрабатываю проект и хочу преобразовать одну из схем таблиц в более .. жизнеспособную структуру

В настоящее время:

steamid | mapname | cp1 | cp2 | cp3 | cp4 | cp5 | cp6 | cp7 | cp8 | cp9 | cp10 | cp 11 | cp12 | cp13 | cp14 | cp15 | cp16 | cp17 | cp18 | cp19 | cp20 | cp21  | cp22 | cp23 | cp24 | cp25 | cp26 | cp27 | cp28 | cp29 | cp30 | cp31 | cp32 | cp33 | cp34 | cp35 | zonegroup

steamid - это идентификатор пользователя, mapname - этокарта, столбцы cp # хранят время игроков для конкретной контрольной точки, а группа зон хранит информацию о том, какой «этап» карты

Я хочу изменить его на:

steamid | mapname | cp | time | zonegroup

Есть лиреалистичное решение для преобразования этой таблицы, сохраняя при этом данные, перемещая время, которое ранее было сохранено в cp1, в новый столбец cp, который будет иметь значение 1, а новый столбец времени будет содержать все, что было в старом столбце cp1

Спасибо!

Ответы [ 2 ]

0 голосов
/ 13 октября 2018

Вы можете перенести данные в новую таблицу с очень длинным INSERT ... SELECT запросом:

INSERT INTO new_table (steamid, mapname, cp, time, zonegroup)
SELECT * FROM (
    SELECT steamid, mapname, 1 AS cp, cp1 AS time, zonegroup FROM old_table
    UNION ALL
    SELECT steamid, mapname, 2, cp2, zonegroup FROM old_table
    UNION ALL
    ...
    SELECT steamid, mapname, 35, cp35, zonegroup FROM old_table) v
0 голосов
/ 13 октября 2018

Вы можете использовать (lof of) union all

    select steamid, mapname, cp1 as cp , now(), zonegroup 
    from my_table  
    where cp1 is not null
    union all
    select steamid, mapname, cp2 , now(), zonegroup 
    from my_table  
    where cp2 is not null
    union all
    select steamid, mapname, cp3 , now(), zonegroup 
    from my_table  
    where cp3 is not null
    .....
    .....
    .....
    select steamid, mapname, cp34 , now(), zonegroup 
    from my_table  
    where cp34 is not null
    select steamid, mapname, cp35 , now(), zonegroup 
    from my_table  
    where cp35 is not null
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...