Versionen dieses Beitrags

MySQL: SUM der jeweils besten 3

Thepoeppel crop Rolf B
  • MySQL: SUM der jeweils besten 3
  • 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.
  • ~~~sql
  • SELECT bla, blub from hui WHERE dings=bums
  • ~~~
  • kann so eingesetzt werden:
  • ~~~sql
  • 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:
  • ~~~sql
  • 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

MySQL: SUM der jeweils besten 3

Thepoeppel crop Rolf B
  • MySQL: SUM der jeweils besten 3
  • 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.
  • ~~~sql
  • SELECT bla, blub from hui WHERE dings=bums
  • ~~~
  • kann so eingesetzt werden:
  • ~~~sql
  • 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:
  • ~~~sql
  • 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.
  • _Rolf_
  • --
  • sumpsi - posui - clusi