Ankündigung

Einklappen
Keine Ankündigung bisher.

MySQL-Abfrage: MAX und GROUP by Problem

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

  • MySQL-Abfrage: MAX und GROUP by Problem

    Hallo zusammen,

    ich habe ein kleines Problem bei einer MySQL-Abfrage.
    Kurzer Hintergrund: die Abfrage holt aus bestehenden Tabellen Daten raus. Die Tabellen sind alle mit JOIN verknüpft. Es gibt eine einzige LEFT JOIN -Verknüpfung, weil der Eintrag in der ursprünglichen Tabelle leer sein kann.

    Mein Problem liegt bei den Werten l.zeit und lt.name.
    l.zeit holt aus einem Logfile den Timestamp der letzten Änderung - diese wiederum wird anhand der Bug-ID ermittelt. In der Logfile-Tabelle sind also in der Regel etliche Einträge zu einer Bug-ID enthalten. Mit meiner Abfrage habe ich dann erstmal pro Bug-ID mehrere Einträge erhalten. Nachdem ich nur den zeitlich letzten Eintrag will, habe ich das Ganze anhand der bug-ID ge"GROUP"t und auf das l.zeit ein Max gesetzt. Klappt erstmal super: in l.zeit steht für jede Bug-ID nur der höchste Wert (=letzte änderung)

    aaaaber: die Ausgabe von lt.name scheint nun aber von dem Max nicht betroffen zu sein und zeigt etwas ganz anderes an als den zu l.zeit zugehörigen Datensatz.. Als wären die beiden Werte komplett unabhängig voneinander.
    Aber ich möchte ja bei l.zeit den zugehörigen Eintrag lt.name erhalten.
    ich fürchte, ich hab hier irgendwo einen Fehler mit den JOINS gemacht.

    Kann mir da wer helfen?
    Das wäre nett, danke
    PHP-Code:
    SELECT b.idb.erstelltDatumb.ueberschriftb.faelligf.name AS firmabt.name AS bugtypem.name AS mitarbeiterbs.name AS statusma.name AS abteilungb.erledigtDatumMAX(l.zeit) AS letzte_aenderunglt.name AS aenderungstyp
                FROM bug b
                    JOIN firmen f ON f
    .ID b.firmenID
                    JOIN bug_typ bt ON bt
    .id b.typID
                    JOIN mitarbeiter m ON m
    .id b.zugewiesenMitarbeiterID
                    JOIN bug_status bs ON bs
    .id b.statusID
                    JOIN logfile l ON l
    .linkID b.ID
                    JOIN logfile_typ lt ON lt
    .ID l.logfileTypID
                    LEFT JOIN mitarbeiter_abteilung ma ON ma
    .id b.zugewiesenAbteilungID
                WHERE b
    .id IN (140632,272020GROUP by b.id
    KlyX


  • #2
    MySQL ist dumm. Strunzdumm. In Abfragen, in denen aggregiert wird (max), müssen alle Spalten des Ergebnisses entweder aggregiert oder gruppiert sein. Dein SQL verstößt dagegen, was alle Datenbanken sofort als syntaktisch falsch ablehnen würden. MySQL (außer ganz aktuelle Versionen) liefern stattdessen ein falsches Ergebniss. Sondermüll halt.
    PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

    Kommentar


    • #3
      Okay, verstehe. Wie müsste ich korrekt vorgehen? Bin da nicht so sehr bewandert. Lasse mich also gerne belehren wie es konkret besser geht

      Kommentar


      • #4
        Das erklärte ich bereits. Der Satz beginnt mit "In Abfragen" und ended mit "aggregiert oder gruppiert sein.". Du findest ihn, da bin ich mir sicher
        PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

        Kommentar


        • #5
          Soweit habe ich das schon verstanden und gefunden Aber bei der Umsetzung hapert es massiv.
          Hab zwar ein Beispiel von einer ähnlichen, aber ziemlich komplexeren Abfrage - erschließt sich mir die Logik nicht.
          Es fehlt mir also wohl irgendwo an Wissen und Handwerkzeugs, deinen Tipp in Realität umzusetzen.

          Wenn ich das so erstmal richtig interpretiere, was ich gestern noch so gelesen habe, müsste ich quasi den JOIN von logfile und logfile_typ mit einem zusätzlichen SELECT ausstatten und.... oder so... keine Ahnung

          Kommentar


          • #6
            Ich hab jetzt keinen Bock, irgendwie alle Deine Tabellen zu erraten etc. Fakt ist: alle Spalten im Result entweder aggregiert oder gruppiert, sonst funktioniert das (funktionieren im Sinne: keine Fehlermeldung, nicht aber im Sinne korrektes Ergebniss) nur unter Ausnutzung schwerer Bugs in älteren MySQL-Versionen. Also wenig zukunfssicher und noch weniger sinnvoll.

            Möglicherweise suchst Du nebenbei auch noch Window-Funktionen, mit denen man quasi ein Fenster über das Resultat legen kann und über dieses Fenster (das können auch mehrere Fenster und unabhängig voneinander sein) aggregieren kann. Das kann aber MySQL nicht. Die Syntaxt ist prinzipiell so: select ..., aggregat_function() over (...), ..., wobei im over(...) dann diese 'Fenster' definiert werden können. Aber, wie gesagt, davon ist MySQL noch relativ weit weg ...
            PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

            Kommentar


            • #7
              Sum ist eine Aggregatfunktion und wenn du eine Aggregatfunktion verwendest musst du einfach alle Spalten im GROUP BY aufführen, die keine Funktion haben, auch wenn du nur nach einer Spalte gruppieren willst. Das sind nun mal die Regeln.
              Code:
              GROUP by
                  b.id, b.erstelltDatum, b.ueberschrift, b.faellig, f.name, bt.name, m.name,
                  bs.name, ma.name, b.erledigtDatum, lt.name;

              Kommentar


              • #8
                Zitat von KlyX Beitrag anzeigen
                Wenn ich das so erstmal richtig interpretiere, was ich gestern noch so gelesen habe, müsste ich quasi den JOIN von logfile und logfile_typ mit einem zusätzlichen SELECT ausstatten und.... oder so... keine Ahnung
                Im GROUP BY müssen alle Spalten angegeben werden, die im SELECT ausgewählt werden.

                Kommentar


                • #9
                  Hi zusammen,

                  danke für eure Hinweise.
                  Ich hab das mit dem komplett Gruppieren dann doch noch verstanden (danke akretschmer), nur hat das insofern nicht funktioniert, als das meine Abfrage leider nicht nur zweidimensional ist.
                  Ich habe dann nach längerem rausgefunden, dass ich in einem INNER JOIN noch eine SELECT-Abfrage brauche. Das würde nun zwar grundsätzlich gehen, ist aber komplett ineffizient (die Abfrage benötigt so zu lange, rennt je nachdem sogar ins Timeout).
                  Ich werde das jetzt dahingehend lösen, dass ich 2 separate Abfragen mache und diese dann in meinem Programm zusammen verbaue

                  Danke nochmal!
                  Gruss,
                  KlyX

                  Kommentar


                  • #10
                    Zitat von KlyX Beitrag anzeigen
                    Ich habe dann nach längerem rausgefunden, dass ich in einem INNER JOIN noch eine SELECT-Abfrage brauche. Das würde nun zwar grundsätzlich gehen, ist aber komplett ineffizient (die Abfrage benötigt so zu lange, rennt je nachdem sogar ins Timeout).

                    KlyX
                    Nun ja, MySQL...
                    PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

                    Kommentar


                    • #11
                      Zitat von akretschmer Beitrag anzeigen
                      MySQL ist dumm. Strunzdumm.
                      Zitat von akretschmer Beitrag anzeigen
                      Das kann aber MySQL nicht.
                      Zitat von akretschmer Beitrag anzeigen
                      Nun ja, MySQL...
                      Du nervst.

                      Die Deutsche Rechtschreibung ist Freeware! Du darfst sie kostenlos nutzen, allerdings ist sie nicht Open Source, d.h. Du darfst sie nicht verändern oder in veränderter Form veröffentlichen.

                      Kommentar

                      Lädt...
                      X