2017-06-21 12 views
2

Ich habe ähnliche Fragen dazu gefunden, aber um zu verdeutlichen, ich versuche nicht, Zeilenwerte als Spaltenüberschriften zu verwenden.Konvertieren mehrerer MySQL-Datensätze in einzelne Datensätze

Ich habe eine Tabelle mit den folgenden Spalten:
id = Autowert
ITEM_ID = der Eintrag-ID des Formulars Vorlage
field_id = Feld-ID in der eingereichten Form Eintrag
meta_value = der übermittelte Wert im Formularfeld
created_at = datetime

Ich habe Tutorials gesehen, um die Feldwerte in Spaltenüberschriften umzuwandeln (d. H. field_id1, field_id2 usw.), aber ich versuche tatsächlich, diese Zeilen in einen zusammenhängenden, beschrifteten Datensatz umzuwandeln.

Die Spaltenüberschriften im Idealfall wie folgt aussehen:
item_id (Primärschlüssel)
Vertragsnummer (Wert, bei dem field_id = 100 und item_id = Wert aus der ersten Spalte)
Vendor (Wert wo field_id = 101 und item_id = Wert aus der ersten Spalte)
Typ (Wert, bei dem field_id = 102 und item_id = Wert aus der ersten Spalte)
Scope (Wert wo field_id = 103 AND item_id = Wert aus der ersten Spalte)

Ich weiß, ich könnte dies erreichen, indem Sie eine Reihe von Mini-Abfragen, wo es die item_id und meta_value mit Kriterien gesetzt nur Datensätze anzeigen Von einer bestimmten field_id, dann verbinden Sie sie alle zusammen in einer Master-Abfrage mit der item_id, um alles zusammen zu binden. Aber das scheint aus Performance-Sicht ein schrecklicher Ansatz zu sein.

Wenn mir jemand ein Beispiel geben könnte oder mir vielleicht mit der Terminologie helfen könnte, die ich suchen sollte, würde ich es sehr schätzen !!

Vielen Dank!

Antwort

1

Sie wollen bedingte Aggregation verwenden, zusammen, um Ihre Datensätze aus Ihrer EAV (Entity Attribute Value) Struktur

SELECT item_id, 
     MAX(CASE WHEN field_id = 100 THEN meta_value END) contract, 
     MAX(CASE WHEN field_id = 101 THEN meta_value END) vendor, 
     MAX(CASE WHEN field_id = 102 THEN meta_value END) type, 
     MAX(CASE WHEN field_id = 103 THEN meta_value END) scope  
    FROM table1 
GROUP BY item_id; 

hier um zu Stück ist ein dbfiddle Demo

+0

Unglaublich. Vielen Dank für die Führung! – Nick

1

Sie einen Self-Join für die 4 Werte verwenden könnte

select 
     t1.item_id 
     , t1.meta_value as `Contract Number` 
     , t2.meta_value as Vendor 
     , t3.meta_value as Type 
     , t4.meta_value as Scope 
    from my_table t1 
    inner join my_table t2 on t1.item_id = t2.item_id and t2.fiedl_id = 101 
    inner join my_table t3 on t1.item_id = t3.item_id and t3.fiedl_id = 102 
    inner join my_table t4 on t1.item_id = t4.item_id and t3.fiedl_id = 103 
    where t1.field_id = 100 
Verwandte Themen