Transponieren eine Zeile in Spalten mit MySQL ohne GEWERKSCHAFTEN zu verwenden?
Frage
Ich habe eine Tabelle, die unter dem folgenden ähnelt:
id | cat | one_above | top_level |
0 'printers' 'hardware' 'computers'
Ich mag eine Abfrage schreiben zu können, ohne Gewerkschaften mit , das mir eine Ergebnismenge zurück, dass diese Tabelle Spalten in Reihen transponiert. Was dies bedeutet, ist, dass ich das Ergebnis sein will:
id | cat |
0 'printers'
0 'hardware'
0 'computers'
Ist das möglich in MySQL? Ich kann dies nicht fallen auf der Anwendungsschicht nach unten und durchführen, weil ich diese in eine Suchmaschine, die Fütterung Index auf der ID basiert wird. Verschiedene andere DBMS haben so etwas wie Schwing- und UNPIVOT. Ich würde nicht nur die Einsicht, um etwas zu schätzen weiß, dass ich fehle.
Mahmoud
P. S.
Ich erwäge Wieder Normalisierung der Datenbank als letzte Option, da dies keine triviale Aufgabe sein wird.
Danke!
Lösung
Ich habe dies aus dem Buch The Art of SQL , Seiten 284-286:
Lassen Sie uns sagen, dass Ihre Tabellenname ist foo
.
Erstellen Sie zunächst eine Tabelle namens pivot
:
CREATE Table pivot (
count int
);
Einfügen in diese Tabellen so viele Zeilen, wie es Spalten, die Sie in foo
schwenken möchten. Da Sie drei Spalten in foo
haben, die Sie schwenken möchten, erstellen Sie drei Zeilen in der Pivot-Tabelle:
insert into pivot values (1);
insert into pivot values (2);
insert into pivot values (3);
Jetzt mache ein cartesianischen Verbindung zwischen foo
und pivot
, einem CASE
mit der richtigen Spalte auszuwählen, basierend auf der Zählung:
SELECT foo.id, Case pivot.count
When 1 Then cat
When 2 Then one_above
When 3 Then top_level
End Case
FROM foo JOIN pivot;
Dies sollte Sie geben, was Sie wollen.
Andere Tipps
Nach einigem ziemlich umfangreichen Graben stieß ich auf dieser Seite , die enthalten oder nicht Ihre Antwort kann kann. Es ist eine schwierige in MySQL aber aus konzeptioneller Sicht kann ich eine Abfrage erstellen, die wie folgt verwendet beschreiben (obwohl es wahrscheinlich schrecklich durchführen würde) umsetzen würde. Also ich bin sicher, dass wir einen Weg finden, kann es der richtige Weg zu tun.