eine select abfrage

jetwork

Fleissiger Benutzer
Beiträge
97
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:
Werbung:

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.
 
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.
 
Ich habe schon die folgende Abfrage benutzt. Es hilft aber nicht.

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

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.
 
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?
 
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?

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.
 
Du solltest schon lesen was man dir schreibt:
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.

Was meinst du mit den Spalten zu aggregieren oder gruppieren?

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