MySQL: variable Spaltenanzahl in Ausgabe oder Temp-Tabelle
Der Bär
- datenbank
0
dedlfix
Hallo Zusammen,
ich habe drei Tabellen für ein Reservierungssystem von Sitzplätzen,
die Tagesweise reseviert werden können. Sie sind im wesentlichen wie
folgt aufgebaut:
Tabelle "User":
Namens_ID (int) | Name (chr20)
----------------|-------------
1 | Anne
2 | Beate
3 | Chantal
... | ...
Tabelle "Sitzplaetze":
Sitz_ID (int) | Sitzplatz (chr20)
---------------|-------------
1 | Schöne Aussicht
2 | Späte Einsicht
3 | Gute Absicht
4 | Weite Fernsicht
5 | Bitte um Nachsicht
... | ...
Tabelle "Reservierungen":
Reserv_ID (int) | Datum (date) | Sitz_ID (int) | Namens_ID (int)
----------------------------------------------------------------
0 | 2010-03-20 | 1 | 1
1 | 2010-03-20 | 2 | 2
2 | 2010-03-20 | 3 | 3
3 | 2010-03-21 | 1 | 1
4 | 2010-03-22 | 1 | 1
5 | 2010-03-23 | 1 | 1
... | ... | ... | ...
Nun möchte ich mit SELECT (oder sonstwie), eine Tabelle mit
flexibler Breite (!!!) wie folgt erstellen:
Wunschtabelle:
Datum | Sitz Nr.1 | Sitz Nr.2 | Stitz Nr.3 | ... | Sitz Nr.(Max)
------------------------------------------------------------------------
2010-03-20 | Anne | Beate | Chantal | ... | ...
2010-03-21 | Anne | ... | ... | ... | ...
2010-03-22 | Anne | ... | ... | ... | ...
2010-03-23 | Anne | ... | ... | ... | ...
Anstatt "user.name" (also "Anne", "Beate", "Chantal") würde mir
natürlich "Reservierungen.Reserv_ID" in der obigen Ausgabe als
Zischenergebnis erstmal reichen - der Rest ergibt sich dann.
Die Select Ausgabe, mit die die Wunschtabelle generiert wird, soll also
so flexibel sein, dass die Spaltenanzahl der Anzahl von Sitzplaetze~.Sitz_ID
entspricht (ich möchte nicht den Programmcode ändern wenn sich die Anzahl
der Sitzplätze ändert). Also
SELECT COUNT(Sitz_ID) FROM Sitzplaetze;
-- für Spaltenanzahl
und
SELECT CONCATE("Sitz Nr.", Sitz_ID) FROM Sitzplaetze;
-- für Spaltennamen
Das Hauptproblem scheint zu sein, dass man bei
SELECT select_expr FROM table_references .....
für select_expr immer nur feste Werte fuer die Spaltenausgaben
angeben kann. Oder liege ich da Falsch???
Ich habe einiges probiert: z.B. eine Variable mit den gewünschten
Werten für "select_expr" zu definieren und sie in einer SELECT
Anweisung zu benutzen. Ging nicht! Auch lässt sich in einer SELECT
Anweisung das "select_expr" scheinbar nicht durch weitere SELECT
Anweisungen generieren.
Ich wäre sehr dankbar für qualifizierte Hilfe!
Sollte ich bei dem Aufbau der obigen Tabellen einen Fehler gemacht
haben, so bitte ich natürlich auch um Mitteilung. Ich denke aber,
dass die Tabellen grundsätzlich gut angelegt sind (keine Redundanz,
Erweiterbarkeit der Benutzer-Tabelle und Sitze-Tabelle, unkomplizierter
Tabelenaufbau, etc. ).
Ich werde diesen Artikel selbst mind. eine Woche lang beobachten. Wenn
dir also in den nächsten Tagen noch was einfällt wird dein Beitrag nicht
ungelesen bleiben ....
LG. Der Bär
Hi!
Das Hauptproblem scheint zu sein, dass man bei
SELECT select_expr FROM table_references .....
für select_expr immer nur feste Werte fuer die Spaltenausgaben
angeben kann. Oder liege ich da Falsch???
Nein, du liegst richtig.
Ich habe einiges probiert: z.B. eine Variable mit den gewünschten
Werten für "select_expr" zu definieren und sie in einer SELECT
Anweisung zu benutzen. Ging nicht! Auch lässt sich in einer SELECT
Anweisung das "select_expr" scheinbar nicht durch weitere SELECT
Anweisungen generieren.
Du kannst aber ein Prepared Statement aus einem String heraus generieren.
Wenn du aber wirklich dieses "eval() für MySQL" nachbauen willst, dann ist dafür auch noch eine Stored Procedure empfehlenswert.
Lo!
Du kannst aber ein Prepared Statement aus einem String heraus generieren.
Wenn du aber wirklich dieses "eval() für MySQL" nachbauen willst, dann ist dafür auch noch eine Stored Procedure empfehlenswert.
Lo!
Hallo Lo,
habe mir PREPARE angeschaut (kannte ich noch nicht) und es sieht
erstmal sehr gut aus. Dieses "Vorbereiten" entspricht tatsächlich
etwas den eval() Funktionen anderer Sprachen ...
Wer noch was schlaues weiss möge sich melden - ich saug es begierig
auf!!!
Was mich wundert: was ich in meinem ersten Thread geschrieben habe
(vieleicht ein bischen lang), muss doch wirklich ein absolutes
Standardproblem sein. Ich bin relativ neu bei (My)SQL und habe damit
noch nichts wichtiges gemacht. Aber im Grunde genommen verstehe ich
nicht, das man für ein Standardproblem solche Klimmzüge machen soll.
So etwas wie Sitzplätze resevieren (siehe mein Beispiel) muss doch
nun wirklich Standard sein - oder?
Danke an die, die noch kommen werden, Der Bär
Hi,
was du machen möchtest klingt sehr nach "pivotieren". Das ist imho in der Tat ein Standardproblem. (treffe ich in der Firma ziemlich häufig an)
Manche wenige Datenbanksystem bieten dafür einen mehr oder minder flexiblen PIVOT() Operator. MySQL wahrscheinlich nicht. Persönlich würde ich eine Pivotierung ausserhalb der DB z.b. mit Hilfe von Schleifchen bevorzugen.
Gruss, Frank