Rolf B: MySQL: SUM der jeweils besten 3

Beitrag lesen

Hallo Fabienne,

ja, das ist das "Ranking für Arme". Du zählst pro Sportler und Ergebnis, wieviele Ergebnisse gleich oder schlechter diesem Ergebnis sind. Der Count entspricht dann dem Rang.

Passe diese Query mal für deinen Bedarf an, so dass sie genau die Zeilen liefert, die Du erwartest, und dann legst Du einen SELECT drumherum, der pro Spieler-ID die Ergebnisse aufsummiert.

Man kann nämlich das Ergebnis einer Query immer als Eingabe eines FROM verwenden, man muss es nur in Klammern setzten und einen Aliasnamen (correlation name) vergeben.

SELECT bla, blub from hui WHERE dings=bums

kann so eingesetzt werden:

SELECT bla, SUM(blub)
FROM (SELECT bla, blub from hui WHERE dings=bums)
GROUP BY bla

Außer mit einem LEFT JOIN kann man diese Technik auch durch einen Subselect realisieren:

SELECT sportler_id,
       einzelergebnis,
       (select count(*) from ergebnisse f 
           where f.sportler_id=e.sportler_id 
             and f.einzelergebnis <= e.einzelergebnis) as rang
FROM   ergebnisse e

Und da kannst Du dann den gruppierenden Select drumherumlegen und nur die Sätze mit Rang 1-3 betrachten.

Eine Lösung ohne diese Ranking-Technik gibt es meines Wissens nach erst am MySQL 8 mit der RANK() OVER PARTITION Funktion.

Eine ganz andere Lösung würde darin bestehen, die Aufgabe nicht im SQL zu lösen sondern in dem System, das die Query-Ergebnisse verarbeitet. Womit geschieht das?

Oder sind wir hier akademisch unterwegs und haben gerade deine Info-Hausaufgaben bearbeitet?

Rolf

--
sumpsi - posui - clusi