Sortierung nach dem Durchschnitt der besten x Werte

Puma242

Grünschnabel
Hallo,

ich möchte aus meiner mySQL Tabelle "vl_ergebnisse" in der es die Spalte "mnr"-Mitgliedsnummer und "punte"-Punkte gibt die Top Werte auslesen. Als Ergebnis benötige ich eine sortierte Liste der Mitgliedsnummern mit Punktergebnissen. Hierbei soll die Sortierung abhängig der besten 5 Ergebnisse je Person erfolgen. Dies funktioniert auch schon so:

Code:
SELECT mnr, avg(punkte) AS durch FROM vl_ergebnisse gr
WHERE punkte >= (SELECT punkte FROM vl_ergebnisse
WHERE mnr = gr.mnr
ORDER BY punkte DESC LIMIT 1 OFFSET 4)
GROUP BY mnr ORDER BY durch DESC");

Nun möchte ich aber auch die Personen in der Liste berücksichtigen, die noch keine 5 Ergebnisse vorweisen können. Bei 2 Ergebnissen erfolgt die Einsotierung mit dem Durchschnitt dieser 2 Werte und bei 3 Ergebnissen, mit dem Durchschnitt dieser 3 Werte. Wenn jemand mehr als 5 Ergebnisse hat, so sollen aber auch nur die besten 5 berücksichtigt werden.

Kann mir hierzu jemand konstruktiv weiter helfen?
 
Zuletzt bearbeitet:
Leider kann ich der Beschreibung nicht folgen.

Mach doch mal ein Datenbeispiel mit Tabellen. So in der Art:
Das hab ich:
Code:
Tabelle mitarbeiter
id | firma_id | name
--------------------
1  | 1        | MA1
2  | 1        | MA2
3  | 2        | MA3

Tabelle Firma
id | name
---------------------
1  | firma1
2  | firma2

Nun will ich wissen, welche Firma wieviele Mitarbeiter hat. Das soll dann so aussehen
Code:
firma_id | firma_name | anzahl_mitarbeiter
------------------------------------------
1        | firma1     | 2
2        | firma3     | 1
 
Code:
tabelle vl_ergebnisse
mnr | punkte
-----------------
1     | 100
1     | 200
2     | 100
2     | 200
3     | 100
3     | 200
3     | 300
3     | 400
3     | 500
3     | 600
1     | 150
4     | 100
4     | 200
5     | 10
5     | 10
5     | 20
1     | 100
6     | 200

Ergebnis:
Code:
mnr | durchschnitt
-----------------
3     | 400
6     | 200
2     | 150
4     | 150
1     | 137,5
5     | 13,3333

Ich hoffe es sind nicht zu viele Zahlen. Aber die Funktion ist so am besten dargestellt.
 
SQL:
select
z.mnr,
avg(z.punkte) as durchschnitt
from 
(SELECT 
    mnr, punkte, 
    IF( @prev <> mnr, @rownum := 1, @rownum := @rownum+1 ) AS rank, 
    @prev := mnr 
  FROM vl_ergebnisse t 
  JOIN (SELECT @rownum := NULL, @prev := 0) AS r 
  ORDER BY t.mnr,t.punkte desc) z
where z.rank <= 5
group by z.mnr
order by durchschnitt desc, z.mnr;
 
Danke, genau das hab ich versucht aber nicht geschafft. Nun kann ich weiter an meiner Webseite arbeiten. Ein großer Schritt. Danke noch einmal.
 

Neue Beiträge

Zurück