Announcement

Collapse
No announcement yet.

seltsames Verhalten - mysql - mit min / having

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • seltsames Verhalten - mysql - mit min / having

    Hallo,

    sagen wir ich habe eine Tabelle fahrzeuge mit 2 spalten
    zulassungsdatum und kennzeichen

    jetzt möchte ich das älteste fahrzeug und das kennzeichen ausgeben.
    die Abfrage funktioniert bei mir:
    Select min(zuldatum), kennz
    from fahrzeuge

    aber mich wundert das, müsste mysql nicht fordern, dass auch auf kennz eine Aggregatsfunktion angewendet wird?

    wenn ich es aber so mache:

    Select min(zuldatum), kennz
    from fahrzeuge
    group by kennz

    dann gibt er mir einfach alles aus. ????

    eine andere möglichkeit müsste ja sein das ganze folgendermaßen zu lösen:

    Select kennz, zuldatum
    from fahrzeuge
    having zuldatum=min(zuldatum);

    aber da wird einfach gar nichts ausgegeben.
    wenn ich max(zuldatum) nehme, ändert sich auch nichts.

    hat hier jemand eine Erklärung für?

  • #2
    jetzt möchte ich das älteste fahrzeug und das kennzeichen ausgeben.
    Nur das allerälteste?

    Wie wär's dann mit

    [highlight=sql]
    SELECT Kennz, ZulDatum FROM fahrzeuge ORDER BY ZulDatum LIMIT 1,1
    [/highlight]

    Ansonsten denke ich, müßte man mit Unterabfragen herangehen, etwa in der Art

    [highlight=sql]
    Select kennz, zuldatum
    from fahrzeuge
    where zuldatum=(SELECT min(zuldatum) FROM Fahrzeuge);
    [/highlight]

    Wobei ich nicht weiss, inwieweit MySQL das unterstützt.

    Viel Erfolg
    Tino
    Ich habs gleich!
    ... sagte der Programmierer.

    Comment


    • #3
      hallo, danke für deine Antwort.

      Die Lösung mit der Unterabfrage hatte ich auch die funktioniert auch! Das mit dem Limit ist auch eine gute Idee. Da hatte ich gar nicht dran gedacht.

      Mir geht es hierbei aber weniger um einen einzigen Weg. sondern ich möchte verstehen, warum die oberen Abfragen nicht funktionieren. denn nach meinem Verständnis müssten sie das.

      Comment


      • #4
        Könnte es daran liegen:

        http://dev.mysql.com/doc/refman/5.1/...functions.html
        Wenn Sie eine Gruppenfunktion in einer Anweisung verwenden, die keine GROUP BY-Klausel enthält, entspricht dies der Gruppierung aller Datensätze.
        Christian

        Comment


        • #5
          hmm. aber ich kenne das so, dass sobald man in der Selectanweisung etwas mit einer funktion aggregiert wie sum, max, min, avg dann muss das mit allen Elementen in der Selektanweisung geschegen, oder diese müssen unter group by gelistet werden. oder täusche ich mich hier?

          Comment


          • #6
            Hallo,
            Originally posted by veyron View Post
            hmm. aber ich kenne das so, dass sobald man in der Selectanweisung etwas mit einer funktion aggregiert wie sum, max, min, avg dann muss das mit allen Elementen in der Selektanweisung geschegen, oder diese müssen unter group by gelistet werden. oder täusche ich mich hier?
            Nein, du täuschst dich nicht! Das man bei MySQL diese Regel nicht beachten muß und unter GROUP BY nicht alle nichtaggregierten Felder aufgeführt werden müssen halte ich persönlich für einen MySQL-Bug (obwohl es wohl eher als Feature verkauft wird), da das Ergebnis einfach undefiniert und nach meiner Auffassung nicht erklärbar ist.

            Originally posted by veyron View Post
            Select min(zuldatum), kennz
            from fahrzeuge
            group by kennz

            dann gibt er mir einfach alles aus. ????
            Es wird nach kennz gruppiert und zu jedem kennz das kleinste zuldatum ausgegeben. Da es sicherlich zu jedem kennz nur ein zuldatum gibt, entspricht dies einfach:

            Select zuldatum, kennz
            from fahrzeuge

            Originally posted by veyron View Post
            Select kennz, zuldatum
            from fahrzeuge
            having zuldatum=min(zuldatum);
            Diese Abfrage ist eigentlich syntaktisch falsch, da hier das GROUP BY komplett fehlt. Das Ergebnis ist deshalb auch nicht interpretierbar (siehe oben).

            Gruß Falk
            Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

            Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

            Comment


            • #7
              vielen Dank für deine Antwort. Die hat mir auf jeden Fall weiter geholfen.

              Evtl kannst du mir auch noch folgende Unklarheit beantworten.

              Wenn ich jetzt mehrere Tabellen habe und diese joine. anschließend verwende ich einzelte attribute aus den verschiedenen Tabellen.
              Muss ich dann IMMER tab1.attribut3 tab2.attribut1 etc nehmen.
              oder reicht es (falls attribut eindeutig) einfach attribut2 zu schreiben ?

              ich habe getestet, dass bei mysql beides geht, aber ich bin mir nicht sicher ob das offiziell so richtig ist?

              Comment


              • #8
                Originally posted by veyron View Post
                ich habe getestet, dass bei mysql beides geht, aber ich bin mir nicht sicher ob das offiziell so richtig ist?
                Wenn das Attribut eindeutig referenzierbar ist genügt die "Kurzschreibe", allerdings würde ich aus Gründen der Übersichtlichkeit bei Joins immer den Tabellennamen/-alias dazuschreiben.
                Bei SQL-Code bitte beachten: Formatierung von SQL in Beiträgen

                Comment


                • #9
                  Originally posted by Falk Prüfer View Post

                  Zitat von veyron
                  Select kennz, zuldatum
                  from fahrzeuge
                  having zuldatum=min(zuldatum);

                  Diese Abfrage ist eigentlich syntaktisch falsch, da hier das GROUP BY komplett fehlt. Das Ergebnis ist deshalb auch nicht interpretierbar (siehe oben).

                  Gruß Falk
                  aber wenn ich das group by doch weg lassen, dann müsste er doch genau eine gruppe machen welche alle Attribute erhält, und würde sich dann hiervon das min(zulDatum) also das älteste fahrzeug raussuchen.

                  mich wundert es, dass es so nicht funktioniert???

                  Comment


                  • #10
                    Hallo,
                    Originally posted by veyron View Post
                    aber wenn ich das group by doch weg lassen, dann müsste er doch genau eine gruppe machen welche alle Attribute erhält, und würde sich dann hiervon das min(zulDatum) also das älteste fahrzeug raussuchen.

                    mich wundert es, dass es so nicht funktioniert???
                    Wenn dich das wundert, dann hast du SQL noch nicht wirklich verstanden. Aggregatfunktionen werden immer über gruppierte Abschnitte gebildet. Diese gruppierten Abschnitte müssen immer definiert werden und den nichtaggregierten Feldern der Select-Liste entsprechen. Einzige Ausnahme: Wenn im Select nur aggregierte Felder aufgeführt sind, kann das GROUP BY weggelassen werden und es wird nur eine Gruppe gebildet.

                    Die Having-Klausel dient dazu, eine Einschränckung durchzuführen NACHDEM Gruppierung und Aggregation durchgeführt wurden. Wenn die Having-Klausel greift, müssen die Gruppen und Aggregate also bereits feststehen. Wenn du dir das vor Augen führst, dann erübrigt sich die Frage warum es nicht funktioniert, ja gar nicht funktionieren kann!

                    Gruß Falk
                    Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

                    Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

                    Comment


                    • #11
                      wie kann ich denn dann eine gruppe über alle attribute machen, wenn diese kein dafür geeignetes feld haben.
                      so dass ich tatsächlich das älteste auto mit der having anweisung finden kann?

                      Comment


                      • #12
                        Originally posted by veyron View Post
                        wie kann ich denn dann eine gruppe über alle attribute machen, wenn diese kein dafür geeignetes feld haben.
                        so dass ich tatsächlich das älteste auto mit der having anweisung finden kann?
                        Mit HAVING gar nicht und beantwortet hast du die Frage selbst schon:
                        Originally posted by veyron View Post
                        ...Die Lösung mit der Unterabfrage hatte ich auch die funktioniert auch! Das mit dem Limit ist auch eine gute Idee. Da hatte ich gar nicht dran gedacht.
                        Gruß Falk
                        Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

                        Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

                        Comment


                        • #13
                          Originally posted by veyron View Post
                          wie kann ich denn dann eine gruppe über alle attribute machen, wenn diese kein dafür geeignetes feld haben.
                          so dass ich tatsächlich das älteste auto mit der having anweisung finden kann?
                          http://jan.kneschke.de/projects/mysql/groupwise-max/
                          Bei SQL-Code bitte beachten: Formatierung von SQL in Beiträgen

                          Comment

                          Working...
                          X