Announcement

Collapse
No announcement yet.

Bekomme eine simple Berechnung nicht hin :(

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

  • Bekomme eine simple Berechnung nicht hin :(

    Hi,
    bin sowohl neu im Forum als auch im Umgang mit Datenbanken.
    Ich habe ein c# Spiel geschrieben, in dem jeder Spieler einen Gladiatorenstall führt und die Kämpfer gegeneinander antreten.
    Die Abfragen bekomme ich alle problemlos hin. Die Kämpfer werden vor dem Kampf geladen, hinterher mit Update zurückgeladen. Sie können ihre Werte verbessern und auch das wird alles problemlos übertragen.
    Ich möchte jetzt jedoch eine einfache Rangliste erstellen. Ich habe mir sagen lassen, dass es schlechter stil ist, berechnete Ergebnisse als direkte Spalte zu integrieren.
    Was ich demnach brauche ist folgendes:
    Die Kämpfer haben Ranglistenpunkte, die sich berechnen sollen aus der Anzahl der Siege, die sie errungen haben, der Anzahl der unendschiedenen Kämpfe und der Anzahl der K.O.-Siege.

    Formel dafür wäre 3 * Siege + Unendschieden + KO-Siege ...
    was muss ich denn nun machen, damit my sql mir so eine Ranglistenpunktetabelle erstellt und nach Punkten sortiert?

    Oder soll ich die Ranglistenpunkte doch direkt als Spalte übernehmen und die jeweilige Berechnung einfach immer mit beim updaten der Kämpferdaten speichern?

    Danke im Voraus,
    Grogmo.

  • #2
    Originally posted by Grogmo View Post
    Hi,
    bin sowohl neu im Forum als auch im Umgang mit Datenbanken.
    Ich habe ein c# Spiel geschrieben, in dem jeder Spieler einen Gladiatorenstall führt und die Kämpfer gegeneinander antreten.
    Die Abfragen bekomme ich alle problemlos hin. Die Kämpfer werden vor dem Kampf geladen, hinterher mit Update zurückgeladen. Sie können ihre Werte verbessern und auch das wird alles problemlos übertragen.
    Ich möchte jetzt jedoch eine einfache Rangliste erstellen. Ich habe mir sagen lassen, dass es schlechter stil ist, berechnete Ergebnisse als direkte Spalte zu integrieren.
    Was ich demnach brauche ist folgendes:
    Die Kämpfer haben Ranglistenpunkte, die sich berechnen sollen aus der Anzahl der Siege, die sie errungen haben, der Anzahl der unendschiedenen Kämpfe und der Anzahl der K.O.-Siege.

    Formel dafür wäre 3 * Siege + Unendschieden + KO-Siege ...
    was muss ich denn nun machen, damit my sql mir so eine Ranglistenpunktetabelle erstellt und nach Punkten sortiert?

    Oder soll ich die Ranglistenpunkte doch direkt als Spalte übernehmen und die jeweilige Berechnung einfach immer mit beim updaten der Kämpferdaten speichern?

    Danke im Voraus,
    Grogmo.

    Dafür nutzt man die rank() bzw. dense_rank() - Funktion.

    Code:
    test=*# select * from grogmo ;
     spieler | siege | unentschieden | ko
    ---------+-------+---------------+----
           1 |     1 |             1 |  1
           2 |     1 |             1 |  1
           3 |     1 |             1 |  2
           4 |     1 |             2 |  1
           5 |     2 |             2 |  1
           6 |     2 |             3 |  1
           7 |     2 |             3 |  2
    (7 rows)
    
    test=*# select spieler, rank() over (order by siege*3 + unentschieden*1 + ko*1 desc) from grogmo order by 1 ;
     spieler | rank
    ---------+------
           1 |    6
           2 |    6
           3 |    4
           4 |    4
           5 |    3
           6 |    2
           7 |    1
    (7 rows)
    
    test=*# select spieler, dense_rank() over (order by siege*3 + unentschieden*1 + ko*1 desc) from grogmo order by 1 ;
     spieler | dense_rank
    ---------+------------
           1 |          5
           2 |          5
           3 |          4
           4 |          4
           5 |          3
           6 |          2
           7 |          1
    (7 rows)
    
    -- oder sortiert nach Rang
    
    test=*# select spieler, rank() over (order by siege*3 + unentschieden*1 + ko*1 desc) from grogmo order by 2 ;
     spieler | rank
    ---------+------
           7 |    1
           6 |    2
           5 |    3
           4 |    4
           3 |    4
           1 |    6
           2 |    6
    (7 rows)
    Edit: MySQL kennt diese Funktion wohl nicht...

    Andreas

    Comment


    • #3
      Hallo,
      im einfachsten Fall würde ja eine absteigende Sortierung nach Punkten genügen
      [highlight=sql]
      ...
      ORDER BY 3 * Siege + Unendschieden + KO-Siege DESC
      [/highlight]

      Gruß Falk
      Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

      Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

      Comment


      • #4
        Oder mit Anzeige der Ranglistenpunkte (aufbauend auf Falks Vorschlag):
        [HIGHLIGHT=sql]SELECT (3 * Siege + Unendschieden + KO-Siege) AS Punkte
        FROM ...
        ORDER BY Punkte DESC [/HIGHLIGHT]
        In manchen Situationen kann der Spalten-Alias in ORDER BY nicht verwendet werden, sondern muss durch die Spaltennummer ersetzt werden (bitte probieren).

        Gruß Jürgen
        Zuletzt editiert von Jürgen Thomas; 21.12.2012, 12:21. Reason: Zusatz zum Spalten-Alias

        Comment


        • #5
          Vielen Dank für die Antworten.
          Ich werde es nachher nach der Arbeit gleich mal testen

          Comment


          • #6
            Hat perfekt funktioniert. Also Danke nochmals für Eure Hilfe

            Comment

            Working...
            X