2017-05-03 9 views
1

Ich muss eine Tabelle schwenken, entweder für eine Ansicht oder zum Auslagern von Daten in eine bereits vorhandene Tabelle, die bereits als eine geschwenkte Tabelle eingerichtet wurde. Meine Hauptfrage ist zu wissen, wie man die Daten auswählt und dreht.MySQL - Eine 1: n-Beziehung über 2 Tabellen schwenken

Beispieldaten

Tabelle 1:

user_id  user_email  first_name  last_name 
------------------------------------------------------------- 
1    [email protected]  John    Doe 
2    [email protected] Jimmy   Carter 

Tabelle 2:

user_id  type  job_title  job_description 
--------------------------------------------------------- 
1    Job 1  Some Job  play all day! 
1    Job 2  Another Job  all work no play! 
2    Job 1  Clown   IT's not funny 

geschwenkt TABLE
was ich versuche zu erreichen ist:
Ich habe die Tabellennamen und Daten für die Benutzerfreundlichkeit gekürzt.

uid email fname lname jtitle-1 jdesc-1 jtitle-2 jdesc-2 
---------------------------------------------------------------------------- 
1  [email protected]> John  Doe  Some Job play all> Another J> all wo> 
2  [email protected]> Jimmy Carter Clown  IT's not> null  null 

Ich habe nach einigen Beispielen gesucht, aber keine sind genau das, wonach ich suche.

MySQL pivot table
http://stratosprovatopoulos.com/web-development/mysql/pivot-a-table-in-mysql/


UPDATE
natürlich bald danach kam in einer Lösung, die ich veröffentlicht.
http://stratosprovatopoulos.com/web-development/mysql/pivot-table-with-dynamic-columns/

Dies funktioniert der Trick
MAX (IF (pa.fieldname = 'Größe', pa.fieldvalue, NULL)) AS Größe

+0

Gibt es eine endliche Anzahl von Jobtiteln, die ein Benutzer halten kann? – DarbyM

+0

Ja, es dürfen maximal 5 Jobs eingegeben werden. Natürlich, nachdem ich meine Frage gestellt habe, bin ich auf dieses ... gestoßen, das den Job zu erledigen scheint. -> MAX (IF (pa.fieldname = 'size', pa.fieldvalue, NULL)) AS Größe – ipixel

Antwort

0

Was Sie suchen ist ein Joe Celko (SQL for Smarties) - Stil-Pivot, indem auf dem PK der Primärtabelle gruppiert wird und selektiv Tabelle-2-Werte basierend auf dem relativen "Typ" ausgewählt werden.

SELECT u.user_id AS uid, 
    u.user_email AS email, 
    u.first_name AS fname, 
    u.last_name AS lname, 
    MAX(CASE WHEN j.type = 'Job 1' THEN j.job_title ELSE NULL END) AS `jtitle-1`, 
    MAX(CASE WHEN j.type = 'Job 1' THEN j.job_description ELSE NULL END) AS `jdesc-1`, 
    MAX(CASE WHEN j.type = 'Job 2' THEN j.job_title ELSE NULL END) AS `jtitle-2`, 
    MAX(CASE WHEN j.type = 'Job 2' THEN j.job_description ELSE NULL END) AS `jdesc-2`, 
    MAX(CASE WHEN j.type = 'Job 3' THEN j.job_title ELSE NULL END) AS `jtitle-3`, 
    MAX(CASE WHEN j.type = 'Job 3' THEN j.job_description ELSE NULL END) AS `jdesc-3`, 
    MAX(CASE WHEN j.type = 'Job 4' THEN j.job_title ELSE NULL END) AS `jtitle-4`, 
    MAX(CASE WHEN j.type = 'Job 4' THEN j.job_description ELSE NULL END) AS `jdesc-4`, 
    MAX(CASE WHEN j.type = 'Job 5' THEN j.job_title ELSE NULL END) AS `jtitle-5`, 
    MAX(CASE WHEN j.type = 'Job 5' THEN j.job_description ELSE NULL END) AS `jdesc-5` 
FROM users AS u 
LEFT JOIN jobs AS j ON j.user_id = u.user_id 
GROUP BY u.user_id; 
+0

Also funktioniert das ähnlich wie meine Lösung, außer Minen erfordert keine Gruppe von. Ansonsten ist es großartig. Irgendwelche Gedanken zu deiner Lösung - meiner Meinung nach? – ipixel

+0

@ipixel Ich sehe Ihre Lösung nicht, aber es gibt keine richtige Lösung für dieses Problem ohne Gruppenklausel. Wenn Sie die Gruppe eliminieren und eine Aggregatfunktion (z. B. MAX) in der SELECT-Klausel haben, werden alle Zeilen aggregiert. Wenn Sie die max-Aggregatfunktion in der SELECT-Klausel nicht angeben, werden die richtigen Werte nicht ausgewählt. –