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

eine select abfrage

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von jetwork, 11 November 2014.

  1. jetwork

    jetwork Fleissiger Benutzer

    Hallo Zusammen,


    Ich habe die folgende Tabelle.

    upload_2014-11-11_15-5-43.png

    Ich will die 1,2 und 3 wählen die am größten Version Nummer haben. Ich meine falls ich 2-mal gleiche object_id habe, wähle ich das Objekt das größere Versionnmr besitzt.

    Ich meine die Folgende Tabelle:

    upload_2014-11-11_15-6-0.png


    Es ist vielleicht sehr einfach aber ich konnte es leider nicht schaffen. Google hilft mir auch nicht.


    Danke im Voraus
     
    Zuletzt bearbeitet: 11 November 2014
  2. akretschmer

    akretschmer Datenbank-Guru

    Du selektierst erst einmal objekt_id, max(version) group by objekt_id. Diese Tupel von (objekt_id, version) kannst Du dann als Subselect in einem select * from ... where (ibjekt_id, version) in (hier das Subselect) verwenden.

    In PG ginge es recht schön über DISTINCT ON(...) - aber das ist kein SQL-Standard.
     
  3. jetwork

    jetwork Fleissiger Benutzer

    Ich habe schon die folgende Abfrage benutzt. Es hilft aber nicht.

    SELECT *, max(versionnmr)
    FROM my_tabelle
    GROUP BY object_id

    Hier ist das Ergebniss:

    upload_2014-11-12_10-34-13.png

    ich bekomme nicht die Objekte die am größten verisonsnummer haben. Die sind erste 3 Objekte und daneben stehen die maximum versionsnumer die in der Tabelle existieren.
    Ich will aber die Objekte 1,2 und 3 wählen die am größten Versionnummer haben.
     
  4. akretschmer

    akretschmer Datenbank-Guru

    Das ist auch falsch. Syntaktisch falsch. Grundfalsch. MySQL wird ab Version 5.7 dies sogar erkennen, bis dahin spielt es blinde Kuh und liefert ein Zufallsresultat, welches wohl sogar von Version zu Version unterschiedlich ist. Du mußt alle Spalten im Select-Teil nennen und alle Spalten müssen entweder aggregiert oder gruppiert werden.
     
  5. jetwork

    jetwork Fleissiger Benutzer

    Ich wusste es nicht. Ich habe aber jetzt so eine Abfrage durchgeführt. Es macht keinen Unterschied:

    SELECT Object_id, wert1, wert2, string1, versionnmr, name , max(versionnmr)
    FROM my_tabelle
    GROUP BY object_id

    Was meinst du mit den Spalten zu aggregieren oder gruppieren?
     
  6. akretschmer

    akretschmer Datenbank-Guru

    aggregieren: Aggregatsfunktionen wie sum(), avg(), ...
    gruppieren: GROUP BY

    Du prüfst jetzt Dein SQL, ob diese Bedingung erfüllt ist.


    Für ganz eilige hier schon mal die Antwort: Nein.
     
  7. Hony%

    Hony% Datenbank-Guru

    Du solltest schon lesen was man dir schreibt:
    In deiner Abfrage sind für die Projektion nur object_id und max(versionnmr) gültige Felder.

    Der erste Teil deiner Abfrage muss also so aussehen:
    Code:
    SELECT object_id, max(versionnmr)
    FROM my_tabelle
    GROUP BY object_id
    
    An die restlichen Daten kommst du entweder per Subselect oder Join. Ich persönlich bevorzuge den Join. Auch wenn man ein wenig tricksen muss:
    Code:
    SELECT B.*
    FROM (
      SELECT object_id, max(versionnmr) AS versionnmr
      FROM my_tabelle
      GROUP BY object_id
    ) AS A
    INNER JOIN my_tabelle AS B
    ON A.object_id = B.object_id
    AND A.versionnmr = B.versionnmr
    
    Gruß
    Hony
     
    ukulele gefällt das.
  8. ukulele

    ukulele Datenbank-Guru

    Die Lösung von Hony% könnte man schon als Referenz-Lösugn bezeichnen, das Problem hat man ja öfter in dieser Form. Allerdings würde ich dazu anmerken, das in Fällen wo der max() Wert mehrfach vorkommen kann auch wieder mehrrere Einträge zurück kommen. In dem Fall kann man noch mit ROW_NUMBER() OVER (ORDER BY .. PARTITON BY...) arbeiten.
     
  9. akretschmer

    akretschmer Datenbank-Guru

    Ja, könnte man. Wenn MySQL das bringen würde ;-)
     
  10. ukulele

    ukulele Datenbank-Guru

    In diesem Fall sollte es eine Versionsnummer immer nur einmal geben, hoffe ich mal :)
     
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