Hi,
Ich dachte mir es so, das die Gruppe nach der Sortieranweisung gebildet wird, dann also der Datensatz angezeigt wird, der der Sortierung entspricht.
nein - es wird erst GROUP BY ausgeführt, was zu n Zeilen bei n unterschiedlichen person_id führt.
Oracle würde bei Deinem Query übrigens tüchtig meckern, weil es eben keinen Sinn ergibt - wenn Du die fotosatz_id haben willst, mußt Du danach auch gruppieren. Andernfalls kann sie nicht sinnvoll ermittelt werden.
Daß MySQL nichts dagegen hat würde ich als Bug bezeichnen; mindestens aber als Problem, auf das Du soeben gestoßen bist.
Mit Deinem SQL-Statement wird mir nun folgendes ausgegeben:
// person_id habe ich mit hinzugefügt
fotosatz_id person_id rang
10 2 1
Ja, das ist "logisch". Er hat nach person_id gruppiert, also quasi Untertabellen ermittelt; aus jeder einzelnen den min(rang) ermittelt; und diesen ausgegeben. Daß Du noch die fotosatz_id haben möchtest ist wie gesagt ein Denkfehler von Dir - das _kann_ nicht funktionieren.
Kann man den den kleinsten gefundenen rang an den Datensatz binden, zudem er gehört?
MySQL 4.0 wird voraussichtlich Subselects beherrschen. Bis dahin - sorry - wirst Du mit den Konsequenzen Deiner DBMS-Wahl leben müssen. Ob es ein einzelnes Statement ohne Subselects gibt, das Deinen Ansprüchen genügt, weiß ich nicht; vermutlich wirst Du das Problem über Programmlogik lösen müssen.
Mit Subselects:
SELECT fotosatz_id, person_id, rang
FROM foto
WHERE person_id||'.'||rang in (
SELECT person_id||'.'||min(rang)
FROM foto
GROUP BY person_id
)
Ohne Gewähr, möglicherweise nicht das Optimum, vermutlich mit DBMS-spezifischer Syntax.
Cheatah