Ranking erstellen

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

  • Ranking erstellen

    Hallo,

    ich hoffe, mir kann hier weitergeholfen werden.
    Ich habe nach einer Formel ein Ranksystem erstellt. Die Formel liefert eine Zahl, die in einer DB gespeichert wird.
    Jeder User erhält praktisch einen solchen Wert.
    Jetzt möchte ich diesen Wert von jedem User auslesen und je nach Höhe einer Position zuweisen (klingt alles etwas kompliziert, sorry)
    Also es sieht so aus:
    User1 ; Wert 60
    User2 ; Wert 3
    User3 ; Wert 500
    User4 ; Wert 88 usw. (die Werte werden jedesmal neu berechnet)

    Ich möchte nun, dass die User nach einer Art Rangliste sortiert werden:
    1: User2
    2: User4
    3: User1 usw.

    Dies geht mit order by, aber ich möchte gerne die Sortierung als Rang in einer DB speichern, eine reine Sortierung hilft also nicht weiter......

    Ich hoffe, ich habe mich verständlich ausgedrückt und es kann mir jemand weiterhelfen! Schon mal Danke vorab

  • #2
    2 fragen:

    1) "(die Werte werden jedesmal neu berechnet)"
    - wann ??

    2) "Jetzt möchte ich diesen Wert von jedem User auslesen und je nach Höhe einer Position zuweisen"
    - darf das auch bei der abfrage sortiert werden (mehr passiert ja in deinem Beispiel nicht)

    wenn ja, dann schau mal order by ASC|DESC

    gruss

    Comment


    • #3
      Zu der ersten Frage:
      Wann, das steht noch nicht fest, ob nun automatisch oder ob der Admin von Zeit zu Zeit das Rankingskript aufrufen wird, oder beides.

      Zu 2)

      Ja, bei der Abfrage kann ich die Zahlen sortiern, nach oben und unten, das ist klar, die Sortierung sollte aber bei der Abfrage passieren und praktisch den aktuellen Rang als Wert ausgeben und in einem extra Feld in der DB speichern.

      Die Abfrage müsste praktisch so aussehen:

      Benutzer 1 hat Wert 75, Benutzer 2 hat Wert 24,Benutzer 3 hat Wert 33;
      Daraus resultiert
      Platz 1 für Benutzer 2
      Platz 2 für Benutzer 3 usw.

      Der Platz wird jetzt in ein Feld "Rang" geschrieben, so dass Benutzer 2 = 1 ist usw.

      Wenn ich nun eine Abfrage erstellen würde, so müsste ich nun nicht mehr die Wert sondern nur den Rang abfragen und ich kann jedem Nutzer sagen, dass er an Poisition x steht, ohne jedesmal ein neues Ranking durchlaufen zu lassen.

      Jetzt fehlt mir jedoch die Idee dies in eine Formel zu packen!?

      Comment


      • #4
        wenn du das so machen möchtest...

        user sortiert ausgeben (nach gewünschter reihenfolge)

        bevor der nächste user kommt (while schleife) den "rank" des nutzers updaten

        mußt halt einen Counter beginnend bei 1 mitlaufen lassen!

        grus

        Comment


        • #5
          ach ja, es geht auch anders...

          die user sind ja sortiert... kannst ja alle zählen, die ein kleineres ranking oder grösseres haben (je nach wunsch) und ihm count+1 ausgeben, dann hat er seinen rang und du sparst dir das setzen der rankings

          Comment


          • #6
            Ansatz ist schon gut, aber ich seh da ein Problem:

            Zuerst muß ich doch alle User mit deren Werten einlesen, um die Wete dann miteinander zu vergleichen, damit ich herausfinden kann, wer auf welche Position soll, danach müssen die Positionen noch den richtigen Usern zugeornet werden und gespeichert.

            Das Problem liegt beim Vergleichen der Werte.
            Wie kann ich mehrere Werte vergleichen und jedem Wert, je nach Größe, einen "Rank" zuweisen?

            Comment


            • #7
              Original geschrieben von ollib
              Ansatz ist schon gut, aber ich seh da ein Problem:

              Zuerst muß ich doch alle User mit deren Werten einlesen, um die Wete dann miteinander zu vergleichen, damit ich herausfinden kann, wer auf welche Position soll
              nein, warum?

              du kannst doch schon in der query nach der punktezahl ordnen lassen.
              I don't believe in rebirth. Actually, I never did in my whole lives.

              Comment


              • #8
                mh.. nur damit ich jetzt das problem verstehe...

                ich geb jetzt mal die ausgangslage und wo was falsch is, bitte korrigieren!

                du hast x user
                jeder user hat punkte
                die user sollen je nach zahl der punkte einen rang von 1-x bekommen (der mit den höchsten punkten hat rang 1)

                was du jetzt willst:
                anzeige der user nach dem rang von 1-x

                anzeige des rangs eines einzelnen users
                (was passiert, wenn 2 oder mehr user die selbe zahl an punkten haben?? haben die dann den selben rang)

                gruss

                Comment


                • #9
                  du hast x user
                  jeder user hat punkte
                  die user sollen je nach zahl der punkte einen rang von 1-x bekommen (der mit den höchsten punkten hat rang 1)

                  was du jetzt willst:
                  anzeige der user nach dem rang von 1-x
                  Bis dahin ist es ok, das ist mit "order by" locker möglich, der Rang soll jetzt jedoch in einem extra Feld der DB gespeichert werden. Bei "order by" weiß PHP jedoch eigentlich nicht, welchen Rang der User tatsächlich hat!
                  Bei gleichem Wert erhält der erste User der ausgelesen wird die jeweilige Position, also frei nach dem Prinzip : "Wer zuerst kommt, malt zuerst"

                  Comment


                  • #10
                    nochmal...

                    jeder user hat punkte!

                    Beispiel
                    user1 = 100 Punkte
                    user2 = 90 Punkte
                    user3 = 50 Punkte
                    user4 = 10 Punkte

                    suchst du jetzt mit "ORDER BY punkte ASC|DESC" (entweder mit ASC oder mit DESC) bekommst du die user nach der anzahl der punkte sortiert ausgegeben... da noch eine zahl nebenbei hochzuzählen ist dann auch ganz leich! also hast du die rangliste IMMER aktuell!

                    so, willst du jetzt den rang von user3 suchst du alle user die mehr punkte haben und zählst die direkt in der abfrage (count!) und addierst eins (+1) dazu und schon hast du den rang des gewünschten users!

                    gruss

                    Comment


                    • #11
                      Das wäre eine Variante, Danke für deine Geduld!!!

                      Comment


                      • #12
                        er hats verstanden!

                        das hab ich dir die ganze zeit versucht zu erklären!

                        Comment


                        • #13
                          Manchmal sitzt man auf der Leitung

                          Comment


                          • #14
                            das ging aber schon als pipeline durch

                            Comment


                            • #15
                              Ein Wurm ist noch drin

                              Ich zähle die User die weniger haben, ansonsten wäre bei deinem Beispiel User 3 auf Platz 3, nicht aber auf Platz 2! Nur der korrekteheit halber, falls noch einer das Prob hat und das versucht nachzubauen, oder hab ich wieder den Denkfehler? Ne, oder?

                              Comment

                              Working...
                              X