Как денормализовать повторяющиеся данные mysql?

Привет, мне нужно сделать некоторую денормализацию таблицы MySQL с повторяющимися данными.

Моя таблица «Публикации» в настоящее время имеет следующий формат:

Publications Source Table   

|  title                   |       author
--------------------------------------------
|  my paper                |       michael
|  my paper                |       bill
|  my paper                |       jill
|  other paper             |       tom
|  other paper             |       amy
|  third paper             |       ben
|  third paper             |       sophie

Мне нужно изменить его на этот формат:

Publications Destination Table

|  title                   |    author   |  author2   |  author 3
|-----------------------------------------------------------------
|  my paper                |    michael  |  bill      |  jill
|  other paper             |    tom      |  amy       |
|  third paper             |    ben      |  sophie    |

Теперь, просто для вашего сведения, мне нужно сделать это, чтобы я мог в конечном итоге получить файл CSV, чтобы данные можно было экспортировать из старой системы в новую систему, для которой требуется файл CSV в этом формате.

Также в таблице много других полей и около 60 000 строк в исходной таблице, но только около 15 000 уникальных заголовков. В исходной таблице есть одна строка для каждого автора. В месте назначения title будет уникальным идентификатором. Мне нужна одна строка для каждого уникального названия публикации. Также я могу заранее подсчитать, какое наибольшее количество авторов имеется в какой-либо публикации, если это упростит задачу.

Как я могу сделать это в MySQL? Спасибо


person Mikey B    schedule 15.11.2016    source источник
comment
Ваша строка поиска Google: mysql pivot query   -  person Dan Bracuk    schedule 15.11.2016
comment
Первый дизайн таблицы выше лучше, чем тот, который вы хотите создать, но все еще требует доработки. Я бы хотел, чтобы таблица публикаций содержала только заголовок и любую другую информацию, для которой публикация может иметь только одно значение. Затем отдельная таблица для каждой части информации, для которой публикация может иметь несколько значений.   -  person CptMisery    schedule 15.11.2016
comment
Пожалуйста, обратите внимание, что формат, который я пытаюсь получить, - это просто формат, для которого кто-то уже написал программу импорта. Данные попадут в хорошо нормализованную корпоративную базу данных, НО поставщик предоставил нам возможность импортировать данные в нее, используя этот конкретный формат CSV.   -  person Mikey B    schedule 16.11.2016


Ответы (2)


Если вы на самом деле не хотите изменять структуру таблицы, а просто хотите получить данные, чтобы вы могли импортировать их в новую систему, вы можете попробовать функцию GROUP_CONCAT() в mysql:

SELECT title, GROUP_CONCAT(author SEPARATOR "|") AS authors FROM publications GROUP BY title;

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

person Stewart Macdonald    schedule 15.11.2016
comment
Я думаю, что ОП гораздо лучше обслуживается запросом, который дает правильный результат, чем реструктуризация таблицы для получения правильного результата. - person Mike Sherrill 'Cat Recall'; 15.11.2016
comment
Это шаг в правильном направлении. Мне все равно придется добавить столбцы заголовков author1, author2 ... author13 и объединить их в текстовые файлы, но это несложно. - person Mikey B; 16.11.2016

Я рекомендую вам нормализовать таблицу, а не добавлять новые столбцы для дополнительных авторов. Таким образом, ваша новая структура таблицы будет выглядеть примерно так:

Publications Source Table   

|  title_id         |       title
--------------------------------------------
|  1                |       my paper
|  2                |       other paper
|  3                |       third paper


|  title_id      |       author
--------------------------------------------
|  1             |       michael
|  1             |       bill
|  1             |       jill
|  2             |       tom
|  2             |       amy
|  3             |       ben
|  3             |       sophie
person mba12    schedule 15.11.2016
comment
Почему вы рекомендуете это, поскольку мне нужны данные в этом формате, чтобы их можно было экспортировать из старой системы в новую систему, для которой требуется файл CSV в этом формате. - person Mikey B; 15.11.2016
comment
Если эта другая система новая, есть ли у вас какой-либо контроль над ней? Можете ли вы изменить его требования? Или сторонник перемен? То, что я предложил, больше соответствует стандартной практике проектирования баз данных. С вашим дизайном было бы намного сложнее писать запросы к таблицам в новой системе, если CSV отражает новую структуру таблицы. И мой дизайн более гибкий с точки зрения количества авторов на заголовок. Ваш дизайн создаст много пустых полей автора, когда заголовок будет меньше максимального, что, как я предполагаю, часто. - person mba12; 15.11.2016
comment
Добавление новых суррогатных идентификаторов не имеет ничего общего с нормализацией. - person Mike Sherrill 'Cat Recall'; 15.11.2016
comment
Идентификаторы связаны с созданием схемы, которая освободит базу данных от аномалий модификации, как описано здесь: en. wikipedia.org/wiki/Database_normalization и многие другие места. Повторение заголовков снова и снова по всей таблице — это способ денормализации таблицы. - person mba12; 15.11.2016
comment
Это не дебаты о нормализации, мне просто нужно получить CSV-файл в целевом формате, потому что кто-то уже написал программу импорта, которая использует этот формат. Данные в конечном итоге окажутся в хорошо нормализованной базе данных, но у меня есть 2 варианта: 1: Ввести 15000 записей вручную, предоставить поставщику CSV-файл, и они импортируют его для меня. - person Mikey B; 16.11.2016