André S.: MySQL DB auslesen; ordnen fehlerhaft

Guten Tag,

mit einem Script lese ich eine MySQL DB aus. Das ist ja nicht weiter
schlimm und funktioniert eigentlich auch :)

Mein Problem ist, dass ich das ausgelesene nach der Spalte "punkte"
ordnen muss, damit eine Art Toplist erstellt werden kann. Problem-
atisch wirds, wenn die Zeilen bei "punkte" alle den gleich Wert, z.
B. 0 haben. Dann kommt das Auslesen durcheinander, Einträge werden
gar nicht, bzw doppelt angezeigt.

So sieht meine Scriptzeile zum Auslesen aus:

$res = mysql_query("SELECT * FROM user ORDER BY pkt DESC LIMIT $start,$userlist_limit", $db) or db_err();

Weißt jemand weiter, wie man dieses Problem "umgehen" kann?

Ich danke schon jetzt für eine Antwort :)

bye. andré

  1. Hello,

    Weißt jemand weiter, wie man dieses Problem "umgehen" kann?

    Als erstes solltest Du mal definieren, was Du unter "durcheinander" und was unter "geordnet" verstehst. Dazu könntest Du uns z.B. gutes Beispielmaterial zur Verfügung stellen, oder aber die Sortierkriterien substantiieren.

    Harzliche Grüße aus http://www.annerschbarrich.de

    Tom

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    Nur selber lernen macht schlau
    1. Hi,

      Als erstes solltest Du mal definieren, was Du unter "durcheinander" und was unter "geordnet" verstehst. Dazu könntest Du uns z.B. gutes Beispielmaterial zur Verfügung stellen, oder aber die Sortierkriterien substantiieren.

      Na gut, habe ich wohl etwas vergessen zu erwähnen.. tut mir leid!

      Normalerweise sollten die in der DB stehenden Einträge nach den
      Punkten sortiert angezeigt werden. Alles schön der Reihe nach.

      In der Realität verhält es sich aber so, dass derselbe Eintrag,
      der die Punktzahl "0" (nach der geordnet wird) enthält, zwei- bis
      dreimal angezeigt wird, während einige Einträge gar nicht angezeigt
      werden.

      Beispiel: User x1 hat eine Punktzahl von 0, x2 ebenfalls. In der Aus-
      gabe des Scripts steht x2 zwei mal, von x1 ist aber keine Spur.

      Hinweis: Es müssen ca. 200 Zeilen geordnet ausgelesen werden, na-
      türlich jeweils durch eine Limitsetzung auf mehrere Seiten (Aufrufe)
      aufgeteilt...

      bye. andré

      1. Hello,

        nichts ist unmöglich, aber dass dieses Verhalten das vorgesehene ist, kann ich auch nicht nachvollziehen. Könnte es sein, dass Dein Index kaputt ist?

        Schon mal $sql="repair $tablename"  ausprobiert?

        Und außerdem kann der Fehler ja auch noch im API stecken, wenn Du das Resultset in ein Array überführst, oder so ähnlich...

        Harzliche Grüße aus http://www.annerschbarrich.de

        Tom

        --
        Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
        Nur selber lernen macht schlau
        1. Guten Morgen,

          Schon mal $sql="repair $tablename"  ausprobiert?

          Ja, das habe ich auch schon gemacht; hat leider zu keinem Ergebnis
          geführt...

          Und außerdem kann der Fehler ja auch noch im API stecken, wenn Du das Resultset in ein Array überführst, oder so ähnlich...

          Hm ja nee, so gute PHP Kenntnisse habe ich jetzt nicht, dass ich
          dich da verstehen kann :)

          Das ausgelesene wird mit Hilfe einer while-Schleife wiedergegeben:
          while($data=mysql_fetch_assoc($res)) { }

          Kann hier der Fehler liegen, oder was meintest du?

          bye. andré

          1. Hello,

            Hm ja nee, so gute PHP Kenntnisse habe ich jetzt nicht, dass ich
            dich da verstehen kann :)

            Das ausgelesene wird mit Hilfe einer while-Schleife wiedergegeben:
            while($data=mysql_fetch_assoc($res)) { }

            Jein, wenn $data nach der Schleife nicht mehr benutzt wird, nicht.
            Der Fehler kann dann also nur in der Schleife stecken, oder eben in der Verarbeitung der in der Schleife aufgebauten Werte _nach_ der Schleife.

            $_liste = array();
            while($_rec = mysql_fetch_assoc($res))
            {
              $_liste[] = $_rec;
            }

            So würde bei jedem Schleifendurchlauf ein Datensatz in $_rec geholt werden, und wenn der mit einem Array und nicht mit false gefüllt ist, in die Liste der Datensätze $_liste aufgenommen.

            Die kann man dann weiterverarbeiten Und dort wird wohl dann irgendwo der Fehler stecken.

            Harzliche Grüße aus http://www.annerschbarrich.de

            Tom

            --
            Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
            Nur selber lernen macht schlau
  2. yo,

    Weißt jemand weiter, wie man dieses Problem "umgehen" kann?

    ich würde den befehl erst einmal ohne die LIMIT klausel ausgeben und schauen, ob ich damit das gewünschte ergebnis bekomme. wenn ja, dann stimmt was mit deinen variablen aus php nicht.

    Ilja