MySQL Gruppieren und addieren niedrigster Werte

mollyman

Grünschnabel
Hallo Zusammen

ich habe eine relativ einfache Tabelle:
mit den Spalten
ID,Name, Wettbewerb,Ergebnis
1, Maier, Liga, 12.5
2, Schulze, Liga, 14
3, Maier , Liga , 16
4, Maier , Liga , 17
5, Maier , Liga , 19
6, Maier , Liga , 22
7, Schulze, Liga, 124
8, Schulze, Liga, 43
9,Schulze, Liga, 10

Ich benötige jetzt eine Abfrage, die mir dien beiden niedrigsten Ergebnisse pro Name sowie deren Summe Aufsteigend mit einer laufenden Nummer vornedran anzeigt, also so

Nummer. Name, Wettbewerb,Ergebnis1 Ergebnis 2, Summe
1, Schulze, Liga, 10, 14, 24
2. Maier, Liga, 12.5, 16 , 28.5

Leider habeich keine wirkliche Idee wie ich das in eine Abfrage packe.
Kann mir da einer Helfen ?
 
Nicht einfach.
Wahrscheinlich geht's auch eleganter. Aber ich habe mal was ausprobiert: http://sqlfiddle.com/#!9/4e9db/1
SQL:
select
  t4.gid, t4.name, t4.wettbewerb,
  sum(if(t4.rank = 1, t4.ergebnis, 0)) as ergebnis1,
  sum(if(t4.rank = 2, t4.ergebnis, 0)) as ergebnis2,
  sum(if(t4.rank < 3, t4.ergebnis, 0)) as ergebnis3
from
  (
    select
      -- Rang zuordnen und gid für die nächste Zeile merken
      @rank := if(@last_gid = @last_gid := t3.gid, @rank+1, 1) as rank,
      t3.*
    from
      -- Variablen initieren
      (select @rank := 0, @last_gid := 0) vars,
      (
        select
          -- Gruppen-ID = kleinste ID in der Gruppe
          (select min(id) from my_table t0 where t0.name = t1.name and t0.wettbewerb = t1.wettbewerb) as gid,
          t1.*
        from my_table t1
        order by t1.name, t1.wettbewerb, t1.ergebnis
      ) t3
  ) t4
group by
  t4.gid, t4.name, t4.wettbewerb
 
supi vielen Dank für deine Schnelle Hilfe.

Aber etwas passt noch nicht ganz genau, die Sortierung. ich finde da auch keine Logik dabei:

gid

teilnehmer
Wettbewerb ergebnis1 ergebnis2 ergebnis3
1 Müller LIGA 1234 0 1234
2 Meyer LIGA 2345 0 2345
3 Schulze LIGA 145 223 368
4 Mollet LIGA 2018 133 0 133
5 Maier LIGA 1234 2345 3579
7 Zauber LIGA 9999 0 9999
8 tata LIGA 123 0 123
9 tutuu LIGA 23 0 23
 
Für jeden Eintrag wird die gid ermittelt.
SQL:
  (SELECT MIN(id) FROM my_table t0 WHERE t0.name = t1.name AND t0.wettbewerb = t1.wettbewerb) AS gid
Also anhand des Namens und des Wettbewerbes die kleinste ID.

OK, du willst eine laufende neue Nummer. Das habe ich übersehen
Dann halt noch das ganze nach dem total sortieren, nochmals ein Layer darüber legen und ein weiteren Zähler als id ausgeben..
http://sqlfiddle.com/#!9/4e9db/3
SQL:
select
  @rank2:= @rank2+1 as id,
  t5.*
from
  (select @rank2 := 0) vars2,
  (
    select
      t4.name, t4.wettbewerb,
      sum(if(t4.rank = 1, t4.ergebnis, 0)) as ergebnis1,
      sum(if(t4.rank = 2, t4.ergebnis, 0)) as ergebnis2,
      sum(if(t4.rank < 3, t4.ergebnis, 0)) as total
    from
      (
        select
          -- Rang zuordnen und gid für die nächste Zeile merken
          @rank1 := if(@last_gid = @last_gid := t3.gid, @rank1+1, 1) as rank,
          t3.*
        from
          -- Variablen initieren
          (select @rank1 := 0, @last_gid := 0) vars1,
          (
            select
              -- Gruppen-ID = kleinste ID in der Gruppe
              (select min(id) from my_table t0 where t0.name = t1.name and t0.wettbewerb = t1.wettbewerb) as gid,
              t1.*
            from my_table t1
            order by t1.name, t1.wettbewerb, t1.ergebnis
          ) t3
      ) t4
    group by
      t4.name, t4.wettbewerb
    order by sum(if(t4.rank < 3, t4.ergebnis, 0))
  ) t5
 
Zurück