Cheatah: mySQL: GROUP BY Problem

Beitrag lesen

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