MySQL экспорт в CSV со связанными полями - PullRequest
1 голос
/ 31 марта 2012

Мне нужно экспортировать MySQL DB в файл CSV.Там, где я собираюсь его использовать, не может быть связанных таблиц, поэтому мне нужно объединить связанные записи в одно поле.Возможно ли это сделать?Например, предполагая такую ​​структуру таблицы:

Items: id as INT, name as VARCHAR
ItemIdentifiers: id as INT, item_id as INT, identifier_id as INT
Identifiers: id as INT, identifier as VARCHAR
ItemColors: id as INT, item_id as INT, color_id as INT
Colors: id as INT, color as VARCHAR

и предполагая эти данные:

Items: (1, 'some name')
ItemIdentifiers: (1, 1, 1), (2, 1, 2)
Identifiers: (1, 'ident1'), (2, 'ident2')
ItemColors: (1, 1, 1), (2, 1, 2)
Colors: (1, 'blue'), (2, 'green')

Как бы получить это:

'some name', 'identif1 identif2', 'blue green'

Это просто базовый пример, но я надеюсь, что он передает то, что я пытаюсь сделать.

1 Ответ

2 голосов
/ 31 марта 2012

Вы можете использовать функцию group_concat в сочетании с SELECT ... INTO

SELECT DISTINCT
       items.name AS `Name`, 
       GROUP_CONCAT(DISTINCT identifiers.identifier 
               ORDER BY identifiers.identifier 
               SEPARATOR ' ') AS `Identifiers`, 
       GROUP_CONCAT(DISTINCT colors.color 
               ORDER BY colors.color 
               SEPARATOR ' ') AS `colors` 
       INTO OUTFILE '/tmp/data.csv'
       FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
       LINES TERMINATED BY '\n'
FROM   items 
       JOIN itemidentifiers 
         ON ( itemidentifiers.item_id = items.id ) 
       JOIN identifiers 
         ON ( itemidentifiers.identifiers_id = identifiers.id ) 
       JOIN itemcolors 
         ON ( itemcolors.item_id = items.id ) 
       JOIN colors 
         ON ( colors.id = itemcolors.color_id ) 
GROUP BY Items.id

Возможно, вы заметили, что слишком много JOIN с.Это потому, что вы использовали реляционные таблицы.Для каждой реляционной таблицы есть 1 дополнительный JOIN

Примечание: Вышеприведенный запрос является экспериментальным.Я еще не проверял это.

...