Alexanevsky
@Alexanevsky
Любительская web-разработка

Как массово разбросать информацию из одного столбца таблицы в несколько других?

Здравствуйте!

Есть БД, в ней таблица, предположим, users. В ней есть несколько столбцов и строк.
Столбцы: id, login, info, email, phone, skype.

Строки:
id: 1, login: qwe, info: Мыло|qwe@qwe.ru||Телефон|79211234567||Skype|qwe, email: , phone: , skype: .
id: 2, login: asd, info: Мыло|asd@asd.ru||Skype|asd, email: , phone: , skype: .
id: 3, login: zxc, info: Мыло|zxc@zxc.ru||Телефон|79217654321, email: , phone: , skype: .
И т.д.

Т.е. изначально вся информация обо всех пользователях забивалась в один единственный столбец под названием info. Когда до меня наконец дошло, что это не удобно, я добавил ещё столбцы и встал перед проблемой: как аккуратно перенести эти данные из одного столбца в остальные? Разделение информации сделано посредством вертикальных палок. Одна вертикальная палка разделяет заголовок и какое-то содержимое, две палки - разную информацию. В начале и в конце, как можно видеть, палок не стоит, т.е. они именно разделительные. Ещё проблемка - не у всех забита полная информация (в примере только у id1 вся информация, у id2 и id3 чего-то не хватает).

Мне нужно рассортировать информацию таким образом, чтобы получилось примерно так:
id: 1, login: qwe, info: , email: qwe@qwe.ru, phone: 79211234567, skype: qwe.
id: 2, login: asd, info: , email: asd@asd.ru, phone: , skype: asd.
id: 3, login: zxc, info: , email: zxc@zxc.ru, phone: 79217654321, skype: .

За ненадобностью столбец info можно будет вообще удалить.

Разумеется, вручную это всё не сделать, так как база достаточно большая.

Прошу Вас предложить варианты. Есть SQL запрос, а я просто его не нашёл, и вы мне его назовёте - буду очень благодарен. Если придётся решать сторонними методами (вплоть до импорта в Excel), ну что поделать - импортируем.

С уважением,
Александр.
  • Вопрос задан
  • 2720 просмотров
Решения вопроса 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
UPDATE `table` SET 
    `email` = IF(LOCATE('Мыло|', `info`) = 0, NULL, 
                SUBSTRING_INDEX(SUBSTRING_INDEX(`info`, 'Мыло|', -1), '|', 1)),
    `phone` = IF(LOCATE('Телефон|', `info`) = 0, NULL,
                SUBSTRING_INDEX(SUBSTRING_INDEX(`info`, 'Телефон|', -1), '|', 1)),
    `skype` = IF(LOCATE('Skype|', `info`) = 0, NULL, 
                SUBSTRING_INDEX(SUBSTRING_INDEX(`info`, 'Skype|', -1), '|', 1));
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
Melkij
@Melkij
PostgreSQL DBA
start transaction
select id, info from users for update; в PHP
Каким угодно методом на стороне php разбираете этот свой формат на необходимые части
update users set ... where id=?
commit;
Можно кусками по сотне записей, если на время обновления всё залочить нельзя.
Ответ написан
Комментировать
infest
@infest
Можно на php (или любом другом удобном языке) простенький скрипт набросать. Выбрал запись, разобрал поле info на нужные данные и записал обратно.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы