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

SQL Problem mit Left Join 2er Tabellen

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von Ryoho1989, 4 Oktober 2018.

  1. Ryoho1989

    Ryoho1989 Benutzer

    Hi ich hab das Problem das Wenn ich versuche einen View zu erstellen das ich bei der Leftjoin in der Tabelle 2 Ergebnisse Liefert. dadurch fängt mysql an mit eine Zweite Zeile mit den Werten zu erstellen.

    nun möchte ich das aber nicht also 2 Zeilen sondern eigentlich als eine Zeile und beide Ergebnisse dann zusammen in die Letze Spalte (Produktname).

    Meine Abfrage bisher:

    SELECT
    aufbereitet.Zeitpunkt,
    aufbereitet.Rezept,
    aufbereitet.Charge,
    aufbereitet.HarzTemp,
    aufbereitet.Feuchtestufe,
    aufbereitet.GewichtMischung,
    aufbereitet.FluessigHarz,
    aufbereitet.Tara,
    enddateien.Staub,
    silo.SiloName,
    silo.Ist,
    silo.Soll
    FROM aufbereitet
    LEFT JOIN enddateien ON aufbereitet.Charge = enddateien.Charge
    inner JOIN silo ON DATE_FORMAT(aufbereitet.Zeitpunkt, '%d.%m.%y %H:%i') = DATE_FORMAT(silo.Zeitpunkt, '%d.%m.%y %H:%i')

    Im Anhang befindet sich ein Bild das meine Situation anschaulicher darstellt.

    Ich hab schon Probiert per GROUP_CONCAT ein zusammenführen zu erreichen, leider bisher ohne erfolg.
    Hier der Code:
    SELECT
    DATE_FORMAT(mischerei_mischereidaten_aufbereitet.Zeitpunkt, '%d.%m.%y %H:%i:%s') AS Zeitpunkt,
    mischerei_mischereidaten_aufbereitet.Rezept,
    mischerei_mischereidaten_aufbereitet.Charge,
    HarzTemp AS 'Harz Temperatur in °C',
    Feuchtestufe AS 'Feuchtestufe in Prozent',
    GewichtMischung AS 'Gewicht Mischung in Kg',
    FluessigHarz AS 'Flüssig Harz in Kg',
    Tara AS 'Tara in g',
    mischerei_staub_enddateien.Staub AS 'Staub in Prozent',
    GROUP_CONCAT(mischerei_silo.SiloName + '' + mischerei_silo.Ist + '/' + mischerei_silo.Soll ORDER BY mischerei_silo.Soll DESC SEPARATOR ';') AS Produktname
    FROM mischerei_mischereidaten_aufbereitet
    LEFT JOIN mischerei_staub_enddateien ON mischerei_mischereidaten_aufbereitet.Charge = mischerei_staub_enddateien.Charge
    inner JOIN mischerei_silo ON DATE_FORMAT(mischerei_mischereidaten_aufbereitet.Zeitpunkt, '%d.%m.%y %H:%i') = DATE_FORMAT(mischerei_silo.Zeitpunkt, '%d.%m.%y %H:%i')

    Das Ergebniss war eine Zeile mit allen werten vorhanden. Aber leider nicht Richtig zugeordnet.

    Wäre wirklich schön wenn hier jemand helfen kann.

    Ich bedanke mich im Voraus.

    Gruß
    Ryoho
     

    Anhänge:

    • 123.JPG
      123.JPG
      Dateigröße:
      157,1 KB
      Aufrufe:
      8
  2. akretschmer

    akretschmer Datenbank-Guru

    GROUP_CONCAT ist eine Aggregatsfunktion. Immer dann, wenn solche Funktionen im Spiel sind, müssen alle Spalten im Resultat entweder aggregiert oder gruppiert sein. Alle Datenbanken bringen Dir sofort einen Syntaxfehler, wenn man diese Regel verletzt - außer MySQL, das liefert ein falsches Ergebniss.

    Ach ja, deine 2 Selects arbeiten auf unterschiedlichen Tabellen, im ersten gibt es die genannte Spalte Produktname nicht, und alle Tabellen haben eines gemeinsam haben: deren Aufbau ist uns unbekannt.
     
  3. Ryoho1989

    Ryoho1989 Benutzer

    Moment das ihr die Tabellen nicht kennt lässt sich ändern :)
    Im Anhang: Aufbereitet, Silo, und Staub.

    Damit kennt ihr auch meine Tabellen.
     

    Anhänge:

  4. akretschmer

    akretschmer Datenbank-Guru

    Dein 123.jpg paßt nicht als Ergebniss zum gezeigten Select. Zu keinem der beiden. Wenn Du 3 aggregierte Spalten willst(Produktname, silo_ist, silo_soll), dann eben auch 3 mal aggregieren.

    Was ich Dir empfehle:

    • Beschreib Dein Problem NACHVOLLZIEHBAR. Mehrere SQL's und Bilder, die offenbar in keinem Zusammenhang stehen, sind eher unpraktisch.
    • mache es den anderen leicht, Dein Problem nachzuvollziehen. Bilder sind NICHT hilfreich, das kann weder ich noch jemand anders via Copy&Paste nachvollziehen. SQL kennt DDL (Data Definition Language), zeige einfach das DDL, um die Tabellen zu erstellen, und DML (Data Manipulating Language) um die Daten in die Tabellen zu laden.
    • MySQL ist einfach nur grottig. Dein gezeigtes zweite SQL ist syntaktisch völlig falsch. Wenn Du aggregierst (GROUP_CONCAT ist eine Aggregation), dann müssen alle Spalten im Resultat entweder aggregiert oder gruppiert sein. Die Macher von MySQL waren offenbar zu bekifft, das zu kapieren, MySQL liefert daher statt einem Fehler ein fehlerhaftes Resultat. Es gibt bessere Alternativen...
     
  5. Ryoho1989

    Ryoho1989 Benutzer

    Ok, ich probiere es wie oben bereits beschrieben ist das Ergebniss auf meine Bisherige Abfrage bezogen.
    das Ergebniss steht oberhalb vom Bild 123.jpg. Was ich möchte ist aber der untere Teil vom 123.jpg.

    Heißt:

    Diese Abfrage ergibt Bild 123.JPG oberer Teil.

    Und wie bereits gesagt hätte ich gerne das Produktname mit SOLL und IST eine Zeile Bilden, in denen dann (Wie versucht in Bild 123.JPG unten anschaulich darzustellen) Wirklich auch alle Werte enthalten sind.

    Da ich ja das Problem habe das die Tabelle Silo zu bestimmten Zeiten auch 2 ergebnisse Liefern kann und ich brauch beide, aber eben nicht in einzelenen Zeilen sondern als eine Komplette Zeile.

    Und die 2te Formel war zur Veranschaulichung was ich schon versucht habe, aber leider gescheitert bin. DIESE ALSO BITTE NICHT EINFACH KOPIEREN.

    Gruß
    Marcel.
     
  6. akretschmer

    akretschmer Datenbank-Guru

    Nun, mal als Minimalbeispiel, mit PostgreSQL:

    Code:
    test=# create table t1 (id serial primary key, name text);
    CREATE TABLE
    test=*# create table t2(t1_id int references t1, val1 text, val2 text);
    CREATE TABLE
    test=*# insert into t1 select s, 'name ' || s::text from generate_series(1,5) s;
    INSERT 0 5
    test=*# insert into t2 select 1+random()*4, 'val1 ' || (s*random())::text, 'val2 ' || (s*random())::text from generate_series(1,10) s;
    INSERT 0 10
    test=*# select * from t1;
     id |  name  
    ----+--------
      1 | name 1
      2 | name 2
      3 | name 3
      4 | name 4
      5 | name 5
    (5 rows)
    
    test=*# select * from t2;
     t1_id |          val1          |          val2         
    -------+------------------------+------------------------
         2 | val1 0.988016527146101 | val2 0.427398704458028
         4 | val1 0.998516688123345 | val2 1.41353619936854
         4 | val1 1.2169502726756   | val2 0.134238843340427
         5 | val1 1.24018055200577  | val2 3.83335310779512
         3 | val1 1.57783562550321  | val2 1.90196860115975
         3 | val1 2.68051312677562  | val2 3.71160718426108
         4 | val1 3.92036078264937  | val2 5.80728109180927
         1 | val1 0.306217957288027 | val2 4.6384057700634
         1 | val1 3.70115587441251  | val2 4.639559132047
         1 | val1 8.31063070800155  | val2 5.42557972948998
    (10 rows)
    
    test=*# select t1.id, string_agg(t2.val1,', '), string_agg(t2.val2,', ') from t1 left join t2 on t1.id=t2.t1_id group by t1.id;
     id |                              string_agg                              |                              string_agg                             
    ----+----------------------------------------------------------------------+----------------------------------------------------------------------
      1 | val1 0.306217957288027, val1 8.31063070800155, val1 3.70115587441251 | val2 4.6384057700634, val2 5.42557972948998, val2 4.639559132047
      2 | val1 0.988016527146101                                               | val2 0.427398704458028
      3 | val1 1.57783562550321, val1 2.68051312677562                         | val2 1.90196860115975, val2 3.71160718426108
      4 | val1 3.92036078264937, val1 1.2169502726756, val1 0.998516688123345  | val2 5.80728109180927, val2 0.134238843340427, val2 1.41353619936854
      5 | val1 1.24018055200577                                                | val2 3.83335310779512
    (5 rows)
    
    test=*#
    
    select kaffee!
     
  7. Ryoho1989

    Ryoho1989 Benutzer

    Hey akretschmer,
    Ich bin hier schon richtig im MariaDB und MYSQL Forum?
    ich würde mich halt sehr freuen wenn es einen Ansatz einer Lösung gibt...
    Ich kann leider mit dem PostgresSQL nicht viel anfangen. Da ich leider nicht die Möglichkeit habe eine andere Datenbank zu verwenden.

    Gruß
    Marcel
     
  8. akretschmer

    akretschmer Datenbank-Guru

    wo scheiterst Du denn noch? In Deinem 123-Bild hast Du hinten 3 aggregierte Spalten. Macht es klick? In meinem Beispiel sind es 2. Auch wenn das mit PostgreSQL gemacht ist - das Prinzip ist das gleiche.
     
  9. Ryoho1989

    Ryoho1989 Benutzer

    Danke jetzt hat es klick gemacht. Ich stand voll aus dem Schlauch. Dank dir wirklich!
     
    akretschmer gefällt das.
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