Ankündigung

Einklappen
Keine Ankündigung bisher.

[MySQL] Hilfe bei Query (Zeilen zu Spalten)

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [MySQL] Hilfe bei Query (Zeilen zu Spalten)

    Hallo zusammen,

    ich arbeite gerade an einer Ticketverwaltung. Darin wird zwischen verschiedenen Ticketarten, welche in einer separaten Tabelle aufgelistet sind, unterschieden (Erwachsene, Ermäßigt, ...). Die Anzahl kann daher variieren.

    Verkauft eine Ticketstelle ein oder mehrere Tickets, wird in der Datenbank eine Buchung angelegt. Die Tabelle bookings enthält die Kundenstammdaten, die Tabelle bookings_data enthält die Verweise auf die Ticketart sowie die Anzahl der Tickets. In der Tabelle bookings_types sind die am Anfang erwähnten Ticketarten aufgeführt.

    Tabelle bookings
    uid, type = foreign keys zu nicht aufgelisteten Tabellen

    Code:
     id | uid | title | name_first | name_last | date                | type
    ----+-----+-------+------------+-----------+---------------------+--------
     1  | 1   | Herr  | Heinz      | Heinrich  | 2010-05-19 16:20:10 | 1
     2  | 1   | Frau  | Frauda     | Frauke    | 2010-05-20 17:22:49 | 1

    Tabelle bookings_data
    bid = bookings.id
    ttid = ticket_types.id

    Code:
     id | bid | ttid | count
    ----+-----+------+-------
     1  | 1   | 1    | 4
     2  | 1   | 2    | 1
     3  | 1   | 3    | 1
     4  | 2   | 1    | 2
     5  | 2   | 2    | 1

    Tabelle ticket_types

    Code:
     id | name
    ----+------------
     1  | Erwachsene
     2  | Ermäßigt
     3  | Haustiere

    Für ein Journal möchte ich nun gerne zu jeder Buchung die Anzahl der verkauften Karten, sortiert nach Ticketart, anzeigen lassen. Das Ergebnis sollte also in etwa so aussehen:

    Code:
     id | uid | title | name_first | name_last | date                | type | Erwachsene | Ermäßigt | Haustiere
    ----+-----+-------+------------+-----------+---------------------+------+------------+----------+-----------
     1  | 1   | Herr  | Heinz      | Heinrich  | 2010-05-19 16:20:10 | 1    | 4          | 1        | 1
     2  | 1   | Frau  | Frauda     | Frauke    | 2010-05-20 17:22:49 | 1    | 2          | 1        |
    Mein Problem liegt nun darin, die Einträge aus ticket_types in eine Spaltenform zu bringen. Ich zerbrech mir schon seit geraumer Zeit den Kopf darüber, aber ich hab noch nichteinmal einen Lösungsansatz. Ist es auf diese Art und Weise überhaupt möglich?
    Das Recht auf Dummheit gehört zur Garantie der freien Entfaltung der Persönlichkeit (Mark Twain).


  • #2
    Hallo,

    notfalls kannst du das mit einem Sub-SELECT lösen:
    SELECT b.*, (SELECT COUNT(*) FROM bookings_data AS bd WHERE bd.bid = b.id AND ttid = 1) AS Erwachsene FROM bookings AS b

    Dynamisch die Zeilen von ticket_types in Spalten umwandeln geht ohne PHP wohl nicht (fällt mir zumindest nichts ein).
    "Mein Name ist Lohse, ich kaufe hier ein."

    Kommentar


    • #3
      Folgendes Beispiel dazu, nicht schön, aber selten...

      Code:
      CREATE TABLE bookings (
       id INT NOT NULL,
       uid INT NOT NULL,
       title VARCHAR(20) NOT NULL,
       name_first VARCHAR(30) NOT NULL,
       name_last VARCHAR(30) NOT NULL,
       uhrzeit DATETIME NOT NULL,
       type INT NOT NULL
      );
      
      INSERT INTO bookings VALUES 
       (1  , 1   , 'Herr' , 'Heinz' , 'Heinrich' , '2010-05-19 16:20:10', 1),
       (2  , 1   , 'Frau' , 'Frauda', 'Frauke', '2010-05-20 17:22:49' , 1);
       
       
      CREATE TABLE bookings_data (
       ind INT NOT NULL,
       bid INT NOT NULL,
       ttid INT NOT NULL,
       anzahl INT NOT NULL
      );
      
      INSERT INTO bookings_data VALUES
      ( 1 , 1  , 1  , 4 ),
      ( 2 , 1  , 2  , 1 ),
      ( 3 , 1  , 3  , 1 ),
      ( 4 , 2  , 1  , 2 ),
      ( 5 , 2  , 2  , 1 );
      
      CREATE TABLE ticket_types (
       id INT NOT NULL,
       name VARCHAR(20) NOT NULL
      );
      
      INSERT INTO ticket_types VALUES 
      ( 1  , 'Erwachsene' ),
      ( 2  , 'Ermäßigt' ),
      ( 3  , 'Haustiere' );
      
      
      SELECT b.id, b.uid, b.title, b.name_first, b.name_last, b.uhrzeit, b.type,
             ( SELECT bd.anzahl  
                 FROM bookings b2
                 JOIN bookings_data bd
                   ON b2.id = bd.bid
                 JOIN ticket_types tt
                   ON tt.id = bd.ttid
                WHERE b2.id = b.id
                  AND tt.id = 1) AS erwachsene,
                  
             ( SELECT bd.anzahl  
                 FROM bookings b2
                 JOIN bookings_data bd
                   ON b2.id = bd.bid
                 JOIN ticket_types tt
                   ON tt.id = bd.ttid
                WHERE b2.id = b.id
                  AND tt.id = 2) AS ermaessigt,
      
             ( SELECT bd.anzahl  
                 FROM bookings b2
                 JOIN bookings_data bd
                   ON b2.id = bd.bid
                 JOIN ticket_types tt
                   ON tt.id = bd.ttid
                WHERE b2.id = b.id
                  AND tt.id = 3) AS haustiere
               
        FROM bookings b 
      ORDER BY b.id;
      
      +----+-----+-------+------------+-----------+---------------------+------+------------+------------+-----------+
      | id | uid | title | name_first | name_last | uhrzeit             | type | erwachsene | ermaessigt | haustiere |
      +----+-----+-------+------------+-----------+---------------------+------+------------+------------+-----------+
      |  1 |   1 | Herr  | Heinz      | Heinrich  | 2010-05-19 16:20:10 |    1 |    4       |          1 |         1 |
      |  2 |   1 | Frau  | Frauda     | Frauke    | 2010-05-20 17:22:49 |    1 |    2       |          1 |      NULL |
      +----+-----+-------+------------+-----------+---------------------+------+------------+------------+-----------+
      2 rows in set (0.07 sec)
      
      mysql>
      Überlege Dir nochmal, ob Du unbedingt die von MySQL reservierten Wörter als Tabellenspalten benötigst (siehe count, type). Das schafft nur unnötig Probleme.

      Grüße
      Thomas

      Kommentar

      Lädt...
      X