2016-04-07 24 views
0

Ich versuche, Daten aus der MySQL-Datenbank zu retrollen. Die Struktur der Tabelle (Tab_1) gibt es:Convert multy Zeilen in Spalten

id key  value 
1 address xyz 
1 post_code 120 
1 country CA 

Wie Sie diese sehen können tatsächlich bestellen Details Informationen.

Ich möchte die Schlüsselspalte zu einer tatsächlichen Spalte und den Wert zu dem Wert dieser Spalte konvertieren. Bedeutung:

id address post_code country 
------------------------------------ 
    1 xyz  120   CA 

Wo id=1 der Schlüssel dieser Ordnung ist.

Die Tabelle in MySQL kann nicht geändert werden. Sein Teil eines geschlossenen Systems, das wir verwenden (WordPress-Plugin) Ich möchte nur eine Abfrage schreiben, die einige Daten daraus erhält ...

Mein Ziel ist es, es in einer Verbindung zu verwenden, wo es einfacher wäre, die zu bekommen Daten:

Select x.address ,x.post_code, x.country 
from orders 
join (...) as x using (order_id=id) 
where order_id=1 

sollte es geben:

address post_code country 
------------------------------------ 
     xyz  120   CA 

Wie Sie es alle Felder von x zu bekommen annehmen zu sehen, die die Adresse, POST_CODE ist, Land usw. die ... in der Verknüpfung ist, wo Ich muss die Abfrage setzen, diekonvertierenzu einer lesbaren structure für den Join.

Wie kann ich das tun?

+0

GROUP BY, Fall Ausdrücke für die verschiedenen Schlüsseltypen ,. – jarlh

+0

Group By wird diese Frage nicht lösen. Die Werte werden nicht in Spalten umgewandelt. Beachten Sie, dass 'key' zu einer Spalte wird, während 'value' den Wert in dieser Spalte darstellt. Wenn ich in "x.address" sage, möchte ich, dass es mir 'xyz' gibt. – java

Antwort

2

Sie ein GROUP BY, CASE Ausdrücke für die verschiedenen Schlüsseltypen verwenden:

select id, 
     max(case when key = 'address' then value end) as address, 
     max(case when key = 'post_code' then value end) as post_code, 
     max(case when key = 'country' then value end) as country 
from orders 
group by id 
+0

Warum benutzen Sie Max? – java

+0

Um den Nicht-Null-Wert auszuwählen. Sie können auch MIN verwenden. (Ich nehme an, es gibt nur eine Adresse/post_code/Land pro ID.) – jarlh

+0

ja es gibt nur eine ... deshalb verstehe ich nicht, warum max oder min benötigt wird ... – java

0

Sie nur 4 wählt verwenden können:

SELECT id, (SELECT value FROM Tab_1 WHERE id = 1 AND `key` = 'address') AS address, 
(SELECT value FROM Tab_1 WHERE id = 1 AND `key` = 'post_code') AS post_code, 
(SELECT value FROM Tab_1 WHERE id = 1 AND `key` = 'country') AS country FROM Tab_1 
GROUP BY id; 
+1

Wenn Sie dies tun, haben zumindest Sub-Abfragen korreliert. (Jetzt geben Sie immer ID = 1 Werte zurück.) – jarlh