Announcement

Collapse
No announcement yet.

Bestenliste Sportverein (top x problem)

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Bestenliste Sportverein (top x problem)

    Hallo zusammen. Ich habe ein relativ dringendes Anliegen. Und zwar bastle ich grade an einer Verwaltung für einen Sportverein , für die Uni. Abgabe ist Freitag, deshalb brennt mir langsam der A**** ...
    Ich habe Turniere, Sportler, Altersklassen und Sportarten als Tabellen in meiner Datenbank angelegt. Diese kommen alle über ihren pk in der Ergebnistabelle zusammen.
    Nun will ich eine Bestenliste haben. Soll heißen ich will die top 5,10,20.... in einer bestimmten Altersklasse und einer bestimmten Sportart haben. Ich weiss dass wird oftmals als top N problem bezeichnet und ich habe auch schon einen query, der mir aber leider nicht das richtige ausgibt.

    Code:
    select * from results as res
               inner join Athlete as ath on (res.sportler = ath.id)
     * * *     inner join Tournament as tour on (res.turnier = tour.id)
     * * *    where Altersklasse = $ak and Sportart = $sportart and
     * * *   wert = (select max(wert) from results as s where res.sportler = s.sportler)                            order by wert desc«;
    Dieser Query gibt mir für die erste Sportart alle werte aus, für die 2. nur noch 3 und für die 3 schon gar keinen mehr!
    Woran könnte denn das liegen? vllt habt ihr ne Lösung und habt des Problem schonmal gesehen, oder sogar selber gehabt.

    P.S. Left Join hab ich auch schon probiert und ich will das ganze nach dem Ergebnis Sortieren. Hierzu habe ich 2 Werte in der Ergebnistabelle. Einmal das richtige Ergebnis , wie 12,22m und einen sortierwert 1222 nachdem auch sortiert werden soll!

    danke ,
    moktor
    Zuletzt editiert von moktor; 15.07.2010, 07:23.

  • #2
    Ein Student, der früh halb sieben schon hier am posten ist - das muss ja wirklich dringend sein

    Also, unter der Annahme, dass jeder nur genau einen Wettkampf in einer Spartart absolviert hat, müßte ja die reine Sortierung nach results.wert ausreichen, also

    [highlight=sql]select * from results as res
    inner join Athlete as ath on (res.sportler = ath.id)
    inner join Tournament as tour on (res.turnier = tour.id)
    where Altersklasse = $ak and Sportart = $sportart
    order by wert desc;[/highlight]

    Das in der Regel ja aber wohl meist mehrere Durchgänge oder Wettkämpe gibt, muss man diese entweder summieren, oder den besten herausfinden. Hier bietet sich eine Gruppierung an:

    [highlight=sql]
    select Sportlername, Sportart,
    Max(result) AS BestesErgebnis,
    Sum(result) AS SummeLeistungen
    from results as res
    inner join Athlete as ath on (res.sportler = ath.id)
    inner join Tournament as tour on (res.turnier = tour.id)
    where Altersklasse = $ak and Sportart = $sportart
    GROUP BY sportler.sportlername, turnier.sportart
    order by Max(result) desc;[/highlight]

    Jetzt haben wir aber ggf. noch das Problem, dass Sportler in dieser Auswertung fehlen. Zum Beispiel, wenn sie an einem Wettkampf nicht teilgenommen haben, es also keinen passenden results - Datensatz gibt.
    Deshalb sollte man vielleicht den Join andersherum aufbauen - ausgehend von den "Stammdaten" (Sportler, Turniere) die results mit einem LEFT JOIN ins Boot holen.

    Eventuell macht auch eine Eingrenzung des Turnierzeitraumes Sinn ("Top 10 für 2010")

    Viel Erfolg!
    Tino
    Ich habs gleich!
    ... sagte der Programmierer.

    Comment


    • #3
      Originally posted by tinof View Post
      Ein Student, der früh halb sieben schon hier am posten ist - das muss ja wirklich dringend sein
      Ja wir sitzen inzwischen schon wieder geschlagene 16h vor den Flimmerkästen. zu 4. wohl gemerkt und kommen nicht aufs ergebnis

      URL AUF ANFRAGE haben leider schon n paar leute sich n scherz erlaubt und kack daten eingefügt!

      Das ist das Projekt, so wie es momentan steht. wenn du mal auf Ergebnisse -> Bestenliste klickst, sollte klar werden was wir wollen.

      Die Sache mit dem Group by haben wir schon versucht, dabei bekommen wir aber nicht die richtigen Datenreihen zu unserem SortierWert (wert)

      Unsere Ergebnistabelle hat die sportart , den sportler und das turnier als fk's , wobei man das turnier vernachlässigen kann. Es geht wirklich nur um eine ALL TIME bestenliste in einer Sportart/altersklasse. Was uns wichtig ist, ist dass Sportler in einer Auswahl nicht 2oder mehrmals auftauchen, sondern wirklich nur mit ihrem absolut bestem wert! Sonst könnte man sagen z.b. Usain Bolt kommt in der All time bestenliste 3 mal vor, bevor auch nur der 3. schnellste auftaucht.

      Ich hoffe anhand der Hp wirds verständlich, wo auch unser Problem liegt. Wenn du mal die Sportart änderst, bekommt man auf einmal nur noch weniger bis gar kein ergebnis... auch und btw. die weiblichen sportarten sind noch nicht befüllt, weil keine zeit die datensätze per hand zu tippen! das dauert so lange!!


      Ahh und was mir grade noch aufgefallen ist. Im normalfall werden hier im Forum immer nur 2 tabellen zu einer 3. zusammengefügt. in unserem Fall sind es ja 3. AK , SA und Sportler.

      danke, moktor
      Zuletzt editiert von moktor; 15.07.2010, 08:15.

      Comment


      • #4
        Sieht doch schon schick aus!

        ...weil keine zeit die datensätze per hand zu tippen! das dauert so lange!!
        Macht Euch doch ein SQL Script mit paar INSERT - Befehlen, das läßt sich leichter vervielfältigen

        Die Sache mit dem Group by haben wir schon versucht, dabei bekommen wir aber nicht die richtigen Datenreihen zu unserem SortierWert (wert)
        Wie? Wie sah das Ergebnis aus? Warum geht der von mir gepostete Ansatz nicht?
        Group By liefert normalerweise nur eine Zeile pro Gruppierung, das ist ja der Sinn dieser Klausel.

        ... wobei man das turnier vernachlässigen kann.
        Dann sollte man es auch aus der Abfrage herausnehmen (tournament?)
        Ich habs gleich!
        ... sagte der Programmierer.

        Comment


        • #5
          Originally posted by tinof View Post
          Sieht doch schon schick aus!


          Macht Euch doch ein SQL Script mit paar INSERT - Befehlen, das läßt sich leichter vervielfältigen


          Wie? Wie sah das Ergebnis aus? Warum geht der von mir gepostete Ansatz nicht?
          Group By liefert normalerweise nur eine Zeile pro Gruppierung, das ist ja der Sinn dieser Klausel.


          Dann sollte man es auch aus der Abfrage herausnehmen (tournament?)

          Also um den Spannungsbogen aufzubauen schreib ich jetzt mal gaaaaaaaaanz langsaaam
          Nein schmarrn wir haben es gerade hin bekommen!
          Das mit dem Group by funzt ned , weil z.b. auch das distinct und das goup bei nur zeilen bzw. spalten betrachten. WEnn jetzt hier in einer Spalte ein max wert vor kommt, nimmt er aber trotzdem den datensatz von der als erstes erkannten reihe in der , der pk gefunden wurde. So war es jedenfalls bei uns.... kann auch am DB SCHEMA liegen aber ist jetzt auch relativ egal
          Mit dem SQL script ist so ne Sache. Die Seite wird grade auch noch gebenchmarkt und daher müssen wir relativ viele datensätze mit verschiedenen sinnvollen werten einfügen... im endeffekt haben wir ca. 500 datensätze geschrieben und das ganze mal 2 ... da wir 2 frameworks vergleichen müssen ... und um ehrlich zu sein, wir haben nicht dran gedacht... aber jetzt hat sichs lesen gelohnt und alle die irgendwann einmal das gleiche Problem haben sollten. Ich müsst die Sportart noch ein 2. mal abfangen, sonst schmeisst euch der Query das was er nicht braucht, raus und ihr kommt nimmer dran... lange Rede kurzer Sinn hier ist der Code:

          [highlight=sql]SELECT * FROM results r
          * * * * * * * *LEFT JOIN athlete ON r.sportler = athlete.id
          * * * * * * * *LEFT JOIN tournament ON r.turnier = tournament.id
          * * * * * * * *WHERE wert = (SELECT MIN(wert) FROM results s WHERE s.sportler = r.sportler AND Sportart = $sportart)
          * * * * * * * *AND Altersklasse = $ak AND Sportart = $sportart ORDER BY Wert ASC LIMIT $limit[/highlight]

          feel free to copy... und gute nacht dann mal

          grüße und danke ,
          moktor
          special thanks to : *trommelwirbel* TINO!!!!
          sorry bin grad nur sau happy!

          Comment


          • #6
            Na prima, Glückwunsch!

            Obwohl...

            Der Holzschuhweitwurf momentan in Sekunden angezeigt wird?!

            Und das MIN() in der Abfrage trifft ja wohl nur für die Laufdisziplinen zu, aber da hab' ich vorhin auch nicht dran geedacht.

            Na, viel Erfolg noch!
            Tino
            Ich habs gleich!
            ... sagte der Programmierer.

            Comment

            Working...
            X