SQL Problem mit Left Join 2er Tabellen

Ryoho1989

Benutzer
Beiträge
5
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
    157,1 KB · Aufrufe: 8
Werbung:
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.
 
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

  • aufbereitet.JPG
    aufbereitet.JPG
    29 KB · Aufrufe: 6
  • Silo.JPG
    Silo.JPG
    26 KB · Aufrufe: 5
  • staub.JPG
    staub.JPG
    26,9 KB · Aufrufe: 4
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...
 
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:

Meine Abfrage bisher:

SELECT
aufbereitet.Zeitpunkt AS Zeitpunkt,
aufbereitet.Rezept AS Rezept,
aufbereitet.Charge AS Charge,
aufbereitet.HarzTemp AS 'Harz Temperatur in °C',
aufbereitet.Feuchtestufe AS 'Feuchtestufe in Prozent',
aufbereitet.GewichtMischung AS 'Gewicht Mischung in Kg',
aufbereitet.FluessigHarz AS 'Flüssig Harz in Kg',
aufbereitet.Tara AS 'Tara in g',
enddateien.Staub AS 'Staub in Prozent',
silo.SiloName AS Produktname,
silo.Ist AS 'Silo_IST',
silo.Soll AS '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')

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.
 
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!
 
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
 
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.
 
Werbung:
Zurück
Oben