Ankündigung

Einklappen
Keine Ankündigung bisher.

Hilfe: Tippspiel Score + Ranking berechnen über mehrere Tabellen

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Hilfe: Tippspiel Score + Ranking berechnen über mehrere Tabellen

    Hallo alle,

    ich arbeite gerade an einem non-kommerziellen Tippspiel (Fussball WM) für mich privat, ein paar Freunde. Ggf. wird es auch bei meiner Arbeit zum Einsatz kommen. Für mögliche Ansprüche an die Performance: Ich gehe von 50 bis 400 Usern aus.

    Ich stehe ich vor einer (für mich) sehr Anspruchsvollen Aufgabe: Nämlich das berechnen der Score der User und das anschließende Ranking.

    Folgender Aufbau der vermutlich relevanten Tabellen (MySql) (unrelevante Felder habe ich ausgelassen)
    Code:
    user
    +---------+-----------+------------+-----------+
    | user_id | firstname | lastname   | username  |
    +---------+-----------+------------+-----------+
    |    1    |   Bob     | Baumeister | Der_Bauer |  
    |    2    |   Max     | Muster     | mmuster   |
    |    3    |   Lorem   | Ipsum      | bla123    |
    +---------+-----------+------------+-----------+
    
    bet
    +--------+---------+---------+---------------+---------------+---------+------------+-------+
    | bet_id | user_id | game_id | team_1_goals  | team_2_goals  | perfect | difference | trend |
    +--------+---------+---------+---------------+---------------+---------+------------+-------+
    |    1   |   2     |    17   |       4       |       2       |    1    |      0     |   0   |
    |    2   |   2     |    18   |       3       |       1       |    0    |      1     |   0   |
    |    3   |   1     |    17   |       2       |       1       |    0    |      0     |   1   |
    |    4   |   2     |    19   |       2       |       3       |    1    |      0     |   0   |
    |    5   |   3     |    17   |       3       |       3       |    0    |      0     |   0   |
    +--------+---------+---------+---------------+---------------+---------+------------+-------+
    - Alle abgegeben Tipps sind hier eingetragen.
    - Über die Felder user_id und game_id sind die entsprechend einem User und einem Spiel zugeordnet.
    - Die Felder team_1_goals und team_2_goals beinhalten den Tipp des Spielers.
    - Wenn er Perfekt tippt (ergebnis getroffen) wird das feld perfect auf 1 gesetzt
    - wenn er die Differenz richtig tippt (z.B. sein Tipp = 3:1, Endergebnis = 4:2) wird das Feld difference auf 1 gesetzt
    - wenn er immerhin die Tendenz (also den sieger) richtig tippt wird das feld trend auf 1 gesetzt.
    
    game
    +---------+--------------+---------------+-----------+-----------+
    | game_id | team_1_goals | team_2_goals  | phase_id  | finished  |
    +---------+--------------+---------------+-----------+-----------+
    |   17    |      4       |       2       |     1     |     1     |
    |   18    |      5       |       2       |     1     |     1     |
    |   19    |      2       |       3       |     2     |     0     |
    +---------+--------------+---------------+-----------+-----------+
    - Hier sind alle Spiele eingetragen.
    - Wenn das Spiel vom Admin ausgewertet ist (Das Endergebnis wird eingetragen) werden die Felder team_1_goals und team_2_goals entsprechen gefüllt und das feld finished auf 1 (true) gesetzt
    - Im Feld phase_id ist hinterlegt ob es sich um ein Spiel der "Gruppenphase" (1), "Ko Phase" (2) oder das Finale (3) handelt
    Score
    - Der Score ist abhängig davon wie oft ein nutzer "perfekt", "differenz" oder "tendenz" richtig getippt hat.
    - Je Nach Phase geben diese verschieden viele Punkte:
    - Gruppenphase: 5 Pkt (Perfekt) | 3 Pkt (Differenz) | 1 Pkt (Tendenz)
    - K.O.-Phase: 10 Pkt (Perfekt) | 6 Pkt (Differenz) | 2 Pkt (Tendenz)
    - Finale: 15 Pkt (Perfekt) | 9 Pkt (Differenz) | 3 Pkt (Tendenz)

    Anforderung 1: Gesamtranking ermitteln
    - Ich will das Ranking (z.B. Top 100) der Spieler ermitteln
    - Anhand wie oft jemand perfekt, diffrenz oder tendenz getippt hat werden die Punkte des Spielers ermittelt (unter Berücksichtigung der Phase)
    - Es werden natürlich nur die Spiele ausgewertet die finished auf 1 gesetzt haben (die also vom admin "ausgewertet" wurden)
    - Wenn Spieler gleichviele Punkte haben kommen sie auf den selben Platz. Der "Platzzähler" soll aber weiter hoch gehen -> Beispiel: Platz 1. Bob, Platz 1. Max, Platz 3. Lorem
    - Die Info wie oft ein Spieler pefekt, differenz oder tendenz getippt hat wird auch benötigt (ebenfalls sortiert nach phase)

    Die Ergebnistabelle sollte dann ungefähr so aussehen:
    Code:
    +-------+----------+-----------+----------+-----------+----------------------+-------------------------+--------------------+-----------------+--------------------+---------------+----------------+-------------------+--------------+
    | platz | username | firstname | lastname | userscore | gruppenphase_perfect | gruppenphase_difference | gruppenphase_trend | kophase_perfect | kophase_difference | kophase_trend | finale_perfect | finale_difference | finale_trend |
    +-------+----------+-----------+----------+-----------+----------------------+-------------------------+--------------------+-----------------+--------------------+---------------+----------------+-------------------+--------------+
    mit den entsprechend gefüllten Werten der User.

    Anforderung 2: Einzelranking ermitteln
    - Wäre das selbe wie oben, nur das ich die Informationen von einem bestimmten User (anhand der user_id) benötigen würde.


    Falls sich jemand berufen fühlt mir hier zu helfen würde mich das sehr freuen!


  • #2
    Bin jetzt viel zu faul (hey, es ist Wochenende, es ist warm, die Sonne scheint ) dein Problem im Detail durchzugehen aber bei so einer kleinen Zielgruppe kannst du, wenn dir das hilft, auch einfach mit den Daten eher in PHP arbeiten statt dir hochkomplexe SQL-Statements zu bauen. Ist ja völlig egal ob die Performance dann weniger gut ist.

    Also hol dir was du auf jeden Fall an Daten brauchst aus der DB und mache dann in PHP weiter, wenn das für dich einfacher ist. Dann ist es halt inperformant - so what.

    Kommentar


    • #3
      Bin jetzt viel zu faul (hey, es ist Wochenende, es ist warm, die Sonne scheint )
      Absolut nachvollziehbar



      Ja ich bin grad dabei es mit PHP und eben mehreren Selects etc zu lösen. Die SQL Variante wäre halt mehr sexy

      Kommentar


      • #4
        - Wenn er Perfekt tippt (ergebnis getroffen) wird das feld perfect auf 1 gesetzt
        - wenn er die Differenz richtig tippt (z.B. sein Tipp = 3:1, Endergebnis = 4:2) wird das Feld difference auf 1 gesetzt
        - wenn er immerhin die Tendenz (also den sieger) richtig tippt wird das feld trend auf 1 gesetzt.
        Du benutzt drei Felder, um eine Information abzudecken... was sprach gegen ein einfaches INT-Feld
        0 - vollkommen daneben
        1 - Tendenz richtig
        2 - Differenz richtig
        3 - Komplett richtiger Tipp
        Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

        Kommentar


        • #5
          Was spricht dagegen direkt die erreichten Punkte zu dem Tipp zu speichern? perfect/difference/trend werden doch auch nachträglich berechnet.

          Ansonten musst du wie lstegelitz schreibt das Ergebnis als ein Feld speichern. Damit kannst du dann auf "- Gruppenphase: 5 Pkt (Perfekt) | 3 Pkt (Differenz) | 1 Pkt (Tendenz)
          - K.O.-Phase: 10 Pkt (Perfekt) | 6 Pkt (Differenz) | 2 Pkt (Tendenz)
          - Finale: 15 Pkt (Perfekt) | 9 Pkt (Differenz) | 3 Pkt (Tendenz)" und die Punkte mittels SUM berechnen." joinen.

          4te Möglichkeit wäre ein Stored Function die die Punkte berechnet.

          5te Möglichkeit ein sehr hässlicher SQL Ausdruck, der die Punkte ermittelt.

          Wenn du dann die jeweiligen Ergebnise pro Tipp hast kannst du das ganze pro Spieler summieren. Für die Rang ermittlung gibt bei Google genug Beispiele.

          Kommentar

          Lädt...
          X