Der Bär: MySQL: variable Spaltenanzahl in Ausgabe oder Temp-Tabelle

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

  1. 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!

    1. 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

      1. 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