sql subquery

hathor1411

Grünschnabel
Hallo

Ich habe bisher noch nicht mit subquery gearbeitet und stosse daher an meine grenzen.

Meine datenbank besteht aus diesen Zellen:

`id`, `user_id`, `event`, `liga_id`, `runde`, `gruppe`, `rennen`, `strecke_id`, `car_id`, `q_zeit`, `q_platz`, `q_abstand`, `r_platz`, `r_punkte`, `r_zeit`, `r_schnellste_runde`


Jetzt soll eine Ligawertung erstellt werden.
Mit einem einfachen SUM befehl bekomm ich es hin.
Jetzt sollten aber nur die besten 5 r_punkte von jeder liga_id summiert werden.

Ich scheitere schon daran , das von jeder liga_id 5 besten r_punkte angezeigt werden.

Hoffentlich könnt ihr mir helfen.

Danke
 
Was für eine Datenbank? Oracle? MySQL?

Ist nicht ganz einfach.
Hier mal ein Beispiel in MySQL, wie man die 2 (für 5 müsste ich mehr Testdaten erstellen) besten jeder Liga ermittelt
Mein Test bei SQLFiddle
SQL:
SELECT
    @rank:=IF(@lastLiga = t1.liga_id, @rank+1, 1) AS rank,
    @lastLiga := t1.liga_id AS liga_id,
    t1.user_id,
    t1.punkte
FROM
    (SELECT @rank:=0, @lastLiga:=0) vars,
    (
        SELECT
            t.user_id,
            t.liga_id,
            SUM(t.r_punkte) AS punkte
        FROM
            my_table t
        GROUP BY
            t.user_id,
            t.liga_id
        ORDER BY
            t.liga_id,
            SUM(t.r_punkte) DESC
      ) t1
HAVING
    rank <=2
 
Zuletzt bearbeitet von einem Moderator:
Hallo und guten Morgen

Ich hab das mal ausprobiert und so richtig komm ich nicht klar.

http://sqlfiddle.com/#!2/eca2d/7

Wenn ich Having auf 3 stelle passiert gar nichts. Bei 4 bekomm ich von allen Ligen die 3 besten ergebnisse.

Kannst du das so weiterrechnen lassen, das am ende dann nur die 4 ligen mit den summierten Punkten rauskommen.

Danke

PS: Endlich mal ein Forum, wo man nicht blöd angemacht wird.
 
Zuletzt bearbeitet:
Ganz zum Schluss sollte das ergebnis dann so aussehen.

1(Rank) 3(Liga_id) 65(Punkte ges.)
2 1 58
3 2 51

(basiert auf den eingaben bei fiddle)

Im Prinzip müsste man die einzelnen punkte von jeder Liga noch zusammenzählen und sortieren.

Dann ist es komplett und ich bin dir sehr dankbar
 
Also nicht nach user?
Dan habe ich den Begriff Liga falsch verstanden.

in dem Fall nimm den user komplett aus dem Query raus und du hast was du willst
 
die 5 besten user jeder liga sollen zusammengezählt werden und sortiert werden.
So das am ende die Liga mit den meisten punkte oben steht.
 
http://sqlfiddle.com/#!2/afe53/5
SQL:
SELECT
  @rang := @rang + 1 AS rang,
  x.*
FROM 
  (SELECT
    z.liga_id,
    SUM(z.r_punkte) AS summe
  FROM 
    (SELECT 
       liga_id, r_punkte, 
       IF( @prev <> liga_id, @rownum := 1, @rownum := @rownum+1 ) AS rank, 
       @prev := liga_id 
     FROM 
       my_table t 
     JOIN 
       (SELECT @rownum := NULL, @prev := 0) AS r 
     ORDER BY 
       t.liga_id,t.r_punkte DESC) z 
  WHERE 
    z.rank <= 5
  GROUP BY 
    z.liga_id
  ORDER BY 
    summe DESC, 
    z.liga_id
    ) x, 
  (SELECT @rang := 0) r;
Basiert im Prinzip auf dem Code den ich bereits einmal gepostet habe, ergänzt um einen Rang.
Mit MySQL ist das ganze etwas umständlich da es dort keine Analytischen Funktionen gibt, aber es ist dennoch möglich.
 
Zuletzt bearbeitet von einem Moderator:
Zurück