2012-03-31 6 views
1

Ich muss meine mysql db in eine CSV-Datei exportieren. Wo ich es verwenden werde, kann keine verknüpften Tabellen haben, also muss ich verwandte Datensätze in einem einzigen Feld zusammenführen. Ist das möglich? Zum Beispiel dieser Tabellenstruktur unter der Annahme:mysql Export nach csv mit verwandten Feldern concated

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 

und unter der Annahme, diese Daten:

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') 

Wie würde ich dies:

'some name', 'Ident1 ident2', ' blau grün '

Das ist nur ein einfaches Beispiel, aber ich hoffe, dass vermittelt, was ich versuche zu tun.

+0

Warum nicht 2 Zeilen haben: eine für 'ident1' und die andere für' ident2'? –

+0

, denn das würde extreme Mengen an unnötigem Duplizieren verursachen. Ich könnte am Ende 20 Datensätze für nur 1 Element haben. – LordZardeck

Antwort

2

Sie können group_concat Funktion in Kombination verwenden, um mit 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 

könnten Sie bemerken, dass es JOIN s zu viele sind. Dies liegt daran, dass Sie relationale Tabellen verwendet haben. Für jede relationale Tabellen gibt es 1 zusätzliche JOIN

Hinweis: Die obige Abfrage ist experimentell. Ich habe es noch nicht getestet.