1. Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm
    Information ausblenden

Komplexe Abfrage

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von ThomasZTH, 28 Dezember 2019.

  1. ThomasZTH

    ThomasZTH Benutzer

    Hallo Zusammen,
    ich komm da einfach nicht weiter... Experte sein ist nicht einfach. :(

    Mein Problem ohne Lösung sieht so aus:

    Tabelle:
    id | form_id | entry_id | meta_key | meta_value |
    1 | 6| 100 | 7 |760001 |
    2 | 6| 100 | 40 |07:00 |
    3 | 6 | 100 | 28 | 08:00 |
    4 | 6 | 101 | 7 |760002
    5 | 6| 101 | 40 |10:00 |
    6 | 6 | 101 | 28 | 13:00 |
    7 | 6 | 102 | 7 |760002
    8 | 6| 102 | 40 |10:00 |
    9 | 6 | 102 | 28 | 13:00 |

    Diese Daten hätte ich jetzt gerne Ausgelesen und in einer neuen Tabelle gespeichert.
    Ergebnis:
    Tournummer | Start | Ende |
    760001 | 07:00 | 08:00 |
    760002 | 10:00 | 13:00 |

    Danke.
     
  2. akretschmer

    akretschmer Datenbank-Guru

    Code:
    test=*# select * from thomaszth ;
     entry_id | meta_key | meta_value
    ----------+----------+------------
          100 |        7 | 760001
          100 |       40 | 07:00
          100 |       28 | 08:00
          101 |        7 | 760002
          101 |       40 | 10:00
          101 |       28 | 13:00
          102 |        7 | 760003
          102 |       40 | 10:00
          102 |       28 | 13:00
    (9 rows)
    
    test=*# select string_agg(meta_value,'') filter (where meta_key = 7) as tour, string_agg(meta_value,'') filter (where meta_key = 40) as start, string_agg(meta_value,'') filter (where meta_key = 28) as ende from thomaszth group by entry_id;
      tour  | start | ende  
    --------+-------+-------
     760001 | 07:00 | 08:00
     760002 | 10:00 | 13:00
     760003 | 10:00 | 13:00
    (3 rows)
    
    test=*#
    
    Klitzekleines Problem: ich verwende PostgreSQL.
     
  3. ThomasZTH

    ThomasZTH Benutzer

    Guten morgen,
    das hat nicht so gepasst bei MySQL.
    Habe aber mit hilfe deines Beispiels folgende Lösung gefunden.

    SELECT
    MAX(CASE WHEN meta_key = 7 THEN meta_value END) AS Tournummer,
    MAX(CASE WHEN meta_key = 40.1 THEN meta_value END) AS Montag,
    MAX(CASE WHEN meta_key = 40.2 THEN meta_value END) AS Dienstag,
    MAX(CASE WHEN meta_key = 40.3 THEN meta_value END) AS Mittwoch,
    MAX(CASE WHEN meta_key = 40.4 THEN meta_value END) AS Donnerstag,
    MAX(CASE WHEN meta_key = 40.5 THEN meta_value END) AS Freitag,
    MAX(CASE WHEN meta_key = 40.6 THEN meta_value END) AS Samstag,
    MAX(CASE WHEN meta_key = 40.7 THEN meta_value END) AS Sonntag,
    MAX(CASE WHEN meta_key = 38 THEN meta_value END) AS Start,
    MAX(CASE WHEN meta_key = 39 THEN meta_value END) AS End,
    MAX(CASE WHEN meta_key = 28 THEN meta_value END) AS Tourgebiet
    FROM `table` WHERE form_id = 6 GROUP BY entry_id

    Das sieht auch soweit gut aus.

    Eine Frage habe ich noch. Wie man sieht, liste ich die Tage auf also Montag bis Sonntag. Gibt es eine Lösung diese in eine Tabellenspalte mit kommas getrennt zu bekommen?

    Beispiel:

    Montag, Dienstag, usw.

    die Daten werden in der Tabelle aus der ich die Daten hole so gespeichert: 1 2 3 4 5 6 7

    Was ist wenn kein Tag in der Tabelle angegeben wird. Also die 40.7 ist leer. In der jetzigen abfrage bekomme ich dann eine NULL. Die möchte ich nicht. :)

    Danke.
     
  4. akretschmer

    akretschmer Datenbank-Guru

    Warum mit Komma getrennt, ein Wert kann nur einen Wert enthalten, also Deine meta_key kann nur 40.1 oder 40.7 oder so sein, nicht mehrere Werte gleichzeitig.

    Code:
    test=*# with t as (select 3 as t) select case when t = 1 then 'Montag' else '' end || case when t = 2 then 'Dienstag' else ''end || case when t = 3 then 'Mittwoch' else '' end as tag, t from t;
       tag    | t
    ----------+---
     Mittwoch | 3
    (1 row)
    
    Wenn Du statt NULL z.B. '' haben willst, dann sage es einfach, siehe oben. Oder nutze coalesce().
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden