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!

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top