Mysql + PHP -> Abfrage

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

  • Mysql + PHP -> Abfrage

    Guten Morgen zusammen,

    vielleicht kann mir hier jemand helfen

    Also es geht um folgendes :
    Bei unserem Browserspiel können durchaus mehrere tausend Spieler teilnehmen. Nun bin ich dabei die Anzeige der Rangliste einzubauen.
    Ich will natürlich keine Liste ALLER Spieler, sondern das ganze soll so aussehen :

    Ich möchte den Eintrag des Spielers haben, plus die 25 Spieler über ihm in der Liste UND die 25 Spieler unter ihm in der Liste.

    Das soll also die standardanzeige sein wenn man auf die Liste geht, damit man direkt sieht wo man sich selbst befindet und wer so direkt über und unter einem ist.


    Nun das Problem für mich --> wie mache ich hierfür am besten die DB Abfrage ?

    Als gegebenen Wert habe ich die eigene Punktezahl, die liegt also vor und kann zur Abfrage verwendet werden.

    Kann man mit mysql irgendwie n count in die Abfrage einbauen ?

    Also ich hab da n Eintrag bekommen für genau diese sache, allerdings war der für Cold Fusion und MSSql gedacht und ich bekomme ihn bei mir nicht zum laufen ;(

    Die Abfrage sah da so aus :
    Code:
    select count(*) as cnt from player where score > #player.score# or (score = #player.score# and id < #playerID#)
    Wäre super nett wenn mir da jemand helfen könnte das ganze für PHP und MySql hinzubekommen.

    Hatte das mal so geschrieben für mich, aber das klappt leider nicht :

    Code:
    $abfrage = ("SELECT COUNT(*) AS cnt FROM " . $dbprefix . "player WHERE score >$score OR (score=$score AND id<$id)") ;
    Bringt zwar keine Fehlermeldung, liefert mir aber auch keinerlei Daten, die Tabelle bleibt leer ;(

    $score = die eigene Punktezahl <-- bekannt
    $playerid = die eigene ID <- bekannt

    Vielen Dank schonmal, bin wirklich kein helles Licht was DB Abfragen angeht

    -----------------------
    Update :

    Also mit der Abfrage :
    Code:
    $abfrage = ("SELECT * FROM " . $dbprefix . "player ORDER by score DESC");
    Kann ich mir wunderbar die ganzen Spieler in der Rangliste anzeigen lassen und es ist auch alles direkt nach Punktezahl sortiert.

    Nur brauch ich das eben für einen "Auszug" aus der Rangliste, wo auch immer sich der Spieler selbst dort befindet

    Zuletzt geändert von DarkWanderer; 22.08.2003, 08:30.
    - Carpe Noctem -

  • #2
    spontan fällt mir gerade nix ein.
    Aber wenn die Anzahl der Einträge der Tabelle nicht zu hoch ist, kannst du diesen Bereich auch bei der ausgabe beschränken. Dann selektierst du zwar immer die komplette Tabelle, aber kannst das Problem per PHP lösen.

    Vielleicht hat ja jemand eine Idee für SQL direkt...

    Kommentar


    • #3
      wenn du seine punktzahl hast, machst du zwei abfragen
      1. erst die 25 über ihm
        Code:
        SELECT 
          username, userid
        FROM tabelle
        WHERE punkte > [i]punktzahl[/i]
        ORDER BY punkte DESC 
        LIMIT 25
      2. dann er selbst
      3. dann die 25 unter ihm
        Code:
        SELECT 
          username, userid
        FROM tabelle
        WHERE 
          punkte <= [i]punktzahl[/i]
          AND
          userid != [i]userid des gewählten users[/i]
        ORDER BY punkte DESC 
        LIMIT 25
      ohne gewähr, aber so sieht's für mich sinnig aus
      Ich denke, also bin ich. - Einige sind trotzdem...

      Kommentar


      • #4
        cool, so einfach kann's sein, wenn man den Wald sieht, und nicht nur lauter Bäume. In einem Query hatte ich keinen Plan, aber so ist ja wirklich cool gelöst.

        Kommentar


        • #5
          Hallo wieder,

          ja also das klappt soweit ganz wunderbar ABER nen Schönheitsfehler hat das ganze noch

          Und zwar, soll ja auch angezeigt werden, auf welchem Platz sich welcher Spieler befindet.

          Also wenn ich in die Topliste schaue will ich ja sehen ob ich nun irgendwo auf Platz 36 oder vielleicht doch eher auf Platz 1567 bin

          Nun hab ich natürlich nicht den Ansatz einer Ahnung wie ich das realisieren soll

          Wenn ich die Topliste komplett der Reihe nach auslese kann ich ja nen $count mitlaufen lassen, der immer um 1 erhöht wird, so hatte ich das in meinem ersten Entwurf zumindest geregelt -> Anzahl der gelesenen Datensätze = Platz in der Rangliste.

          Nur wie kann ich das hier bewerkstelligen ?

          Nach meinem beschränkten Verständniss der Materie müsste ich doch dann einmal die komplette Rangliste soweit von oben her einlesen, bis ich meinen eigenen Platz ermittelt habe und dann erst wie oben verfahren, weil dann hätte ich ja die Platzierung in der Gesamtliste.
          Dann wüsste ich ja auch, das der 20 Plätze über mir meine Position - 20 ist und könnte es Anzeigen.

          Aber wäre das nicht ne Menge unnötiger Traffic und Rechenleistung und geht das vielleicht etwas eleganter ?

          Danke für eure Hilfe,

          liebe Grüsse Darky
          - Carpe Noctem -

          Kommentar


          • #6
            SELECT COUNT(id)
            FROM tabelle
            WHERE punkte > deine punktzahl
            Ich denke, also bin ich. - Einige sind trotzdem...

            Kommentar


            • #7
              ich habe das selbe problem..

              das mit dem ausgeben hab ich schon hinbekommen. aber ich will den Rang nun auch in der DB speichern.. hat wer einen vorschlag?


              danke, mfg

              Kommentar


              • #8
                wenn du die daten ausgegeben bekommst, warum willst du den rang dann noch speichern?

                der rang ergibt sich aus der anzahl der punkte, wenn du den rang jetzt auch noch speicherst, musst du bei jeder änderung der punktzahl auch die werte der spalte rang für alle benutzer anpassen
                Ich denke, also bin ich. - Einige sind trotzdem...

                Kommentar


                • #9
                  die liste wird nur alle 5min aktualisiert.

                  der grund für das speicher in der db ist jener, dass ich im header immer den rang des users anzeigen möchte.

                  mfg

                  Kommentar


                  • #10
                    mrhappiness hat recht den rang also eine sich ständig ändernde zahl) für jeden spieler in der tabelle alle 5min zu ändern ist nicht sinnvoll.

                    hast du nicht von unnötigem Traffic gesprochen?

                    denke mal $_SESSION ist das richtige hier. so brauchst du nur einmal pro session den rang abfragen (oder eben alle 5 min ...)

                    z.b.
                    PHP-Code:
                    if(!isset($_SESSION["rang"]))
                    {
                        
                    $_SESSION["rang"] = $rang// Ergebnis der select

                    ... und besucht mal den ebay(TM)-browser überhaupt: Lauge
                    und damit das Fragen nen Ende hat: Der Progger davon sitzt mir gegenüber !

                    Kommentar


                    • #11
                      mhmm, danke für den tipp.

                      aber gibts nicht von mysql selber eine funktion, die sowas autmoatisch in tabellen einträgt?

                      mfg

                      Kommentar


                      • #12
                        gibt es nicht und du brauchst es auch nicht
                        Ich denke, also bin ich. - Einige sind trotzdem...

                        Kommentar


                        • #13
                          abend,

                          wenn ich mir anders zu helfen wüsste, würd ichs machen..
                          also, der code für die rangliste sieht so aus:

                          PHP-Code:
                          <?PHP 
                          $rang 
                          "1"
                          $db->query("select * from users WHERE punkte=punkte ORDER BY `punkte` DESC"); 
                          while(
                          $datensatz4 $db->data()) { 
                          $punkte_un $datensatz4['punkte']; 
                          $punkte_for number_format($punkte_un0',''.'); 
                          echo(
                          "<TR><TD VALIGN=\"top\" NOWRAP>"); 
                          echo 
                          $rang++; 
                          echo(
                          "</TD><TD  VALIGN=\"top\">"); echo($datensatz4['planet_koordinate_x'] .":".$datensatz4['planet_koordinate_y'] ); 
                          echo(
                          "</TD><TD VALIGN=\"top\"><a href=\"?target=comm-center&to="); 
                          echo(
                          $datensatz4['nick']); echo(" \">"); echo($datensatz4['nick']); 
                          echo(
                          "</TD><TD  VALIGN=\"top\" >"); echo($datensatz4['planet_name']); 
                          echo(
                          "</TD><TD  VALIGN=\"top\" ALIGN=\"right\">"); echo($punkte_for); 
                          echo(
                          "</TD><TD VALIGN=\"top\" ALIGN=\"right\" >"); 
                          echo(
                          $datensatz4['asteroiden_gesamt']); 
                          echo(
                          "</TD></TR>");
                          }
                          ?>
                          danke && mfg

                          Kommentar


                          • #14
                            @FreeK
                            und was soll das ? "...punkte=punkte..." ???? oder der teil "number_format" (denke mal hier gibt es keine fließkomma punkte, oder?)

                            Ist auch die Frage ob es gleiche Ränge gibt. (gleiche Punktzahl gleicher rang)
                            Mal so theoretisch:
                            Stell dir einmal vor es gäbe 51 gleiche punktzahlen. Die Vorgabe sollte sein 25 Plätze davor und 25 nach dem user. Da hier nur nach punkte sortiert wird, könnte es also sein das man an der 51. stelle steht und gar nicht bei dieser sortierung auftauchen würde.
                            ... und besucht mal den ebay(TM)-browser überhaupt: Lauge
                            und damit das Fragen nen Ende hat: Der Progger davon sitzt mir gegenüber !

                            Kommentar


                            • #15
                              number_format gibt mir statt 100000 100.000 aus. ist leichter zu lesen.

                              stimmt, aber ich habe leider noch keine zeit gefunden, mich mit dem problem auseinander zu setzten, da in der testrunde noch keine 2. speiler mit gleicher punkteanzahl waren..

                              mfg

                              Kommentar

                              Lädt...
                              X