Manuel: Sortierproblem mysql-abfrage über mehrere Seiten

Hi,

ich habe vor, bei einer größeren Datenbank die User so ausgeben zu lassen (php/mysql), daß immer nur 50 pro Seite erschjeinen.

Das wollte ich über LIMIT $limit1, $limit2 machen, wobei sich dann jeweils diese beiden Variablen etsprechend der Seitenzahl ändern.

Gleichzeitig ist es aber so, daß ich die Ausgabetabelle per Link in der Spaltenüberschrift nach dem Spaltenkriterium sortieren kann.

Es wäre schön, wenn eine einmal angezeigte Seite (Tabelle) aber dann auch wirklich so sortiert würde, d.h. mit eben dem Datenbestand der 1. Ausgangsseite.
Es ist aber so, daß ich z.B. nach User-ID ausgeben lasse, und wenn ich dann sortieren möchte, ein völlig anderer Datenbestand erscheint (logischerweise), nämlich der des neuen sql-befehls.

Gibt es eine Möglichkeit, z.b. Seite 3 der nach User-ID sortierten Tabelle mit genau diesem Datenbestand nach z.B PLZ sortieren zu lassen, ohne daß nun völlig andere Daten aus der Datenbank hierzu genommen werden?

Viele Grüße und frohes Fest im Voraus

Manuel

  1. Moin!

    Du hast genau drei Möglichkeiten:

    [1] Du lässt die Sortierung ab der zweiten Seite, wie sie ist und/oder startest bei einer Neusortierung wieder bei Seite 1.

    [2] Da Du ohnehin mit einer zweiten Logik arbeitest (Ich unterstelle mal, Du benutzt MySQL im Context von PHP, Perl, Java...) und kannst jeweils nur einen Befehl absetzen, die Rückgaben der Datenbank werden in einem Array gespeichert) kannst Du diesen Array mit den Mitteln Deines Contextes, also der Programmiersprache nach Deinen Wünschen sortieren.

    [3] Solltest Du mehrere Befehle absetzen können, wäre es vorteilhaft, Du schreibst die Ergebnisse der ersten Abfrage in eine temporäre MySQL Tabelle und lässt diese sortiert ausgeben. Das Ergebnis gleicht [2]

    Ich frage mich allerdings, was den Benutzern logischer erscheint. Ich vermute mal mit [1]- Es mach nämlich keinen Sinn "mittendrin" die Sortierung zu ändern. Aber das musst Du wissen, Du schreibst und kennst ja die Anwendung- ich nicht.

    MFFG (Mit freundlich- friedfertigem Grinsen)

    fastix®

    --
    Als Freiberufler bin ich immer auf der Suche nach Aufträgen: Schulungen, Development. Auch  für seriöse Agenturen.
    1. Ich frage mich allerdings, was den Benutzern logischer erscheint. Ich vermute mal mit [1]- Es mach nämlich keinen Sinn "mittendrin" die Sortierung zu ändern. Aber das musst Du wissen, Du schreibst und kennst ja die Anwendung- ich nicht.

      Hi fastix®,

      im prinzip hast Du da nicht ganz unrecht :-) Nagut, dann kann nämlich alles so bleiben, wie es ist :-))

      Frohe Weihnachten

      Manuel

  2. Hi,

    mach es Dir doch nicht so schwer. Du kannst es Dir doch richtig einfach machen:

    1. Du übergibst bei jedem klick auf einen Link, der zur Ergebnisseite führt (z.B. nächste Seite, vorherige ~, Sortierungsänderung) zwei Variablen: $limit, $startindex
    $limit beinhaltet dabei die Anzahl von gezeigten Datensätzen und $startindex den ersten Eintrag der gezeigt wird.
    Die beiden Werte musst du eben berechnen und dann an die links übergeben, sollte ja keine probleme darstellen.

    2. Du übergibst des weiteren eine Variable $sort und schreibst da den Namen des SQL Felds rein, über den Sortiert werden soll.

    3. Du übergibsts eine Variable $order mit asc oder desc um aufsteigende oder absteigende Sortierung zu selektieren...

    Alles andere ist Abfrage Kram mit if, beim erzeugen der Links, aber das wirst du ja schon hinbekommen :o)

    Gesamt siehts dann so aus( Beispiel ): index.php?limit=20&startindex=40&sort=alter&order=desc

    viel glück beim programmieren...

    Weihnachts-Gruss
    Stefan

    1. viel glück beim programmieren...

      Weihnachts-Gruss
      Stefan

      Hi Stefan, jaja, genauso habe ich es doch gemacht, mein Problem war ein ganz anderes, aber ist auch schon gelöst

      Frohe Weihnachten

      Manuel

    2. Hallo,

      1. Du übergibst des weiteren eine Variable $sort und schreibst da den Namen des SQL Felds rein, über den Sortiert werden soll.
      2. Du übergibsts eine Variable $order mit asc oder desc um aufsteigende oder absteigende Sortierung zu selektieren...
        index.php?limit=20&startindex=40&sort=alter&order=desc

      Das sieht gefaehrlich aus. Sicherheitsmaessig.

      Gefaehrlich, weil es jetzt das "desc", das "alter" und die Limit-Zahlen
      vermutlich direkt in die SQL-Query einbauen wird.
      Stichwort SQL Injection.

      Also unbedingt:

      • pruefen, ob limit und startindex wirklich ganze zahlen sind
           (bzw. gleich in Integer umwandeln)
      • pruefen, ob sort ein existierender Feldname ist
      • pruefen, ob order wirklich nur asc oder desc enthaelt

      Daneben duerfte auch mysql_escape_string()
      nuetzlich sein, um den so zusammengebauten
      Teil der SQL-Query zu entschaerfen.
      http://www.php.net/manual/de/function.mysql-escape-string.php

      Gruesse,

      Thomas

      --
      Dank /my/ automatisch ausgeblendet: JavaScript, ASP.
      Manuell "ausgeblendet": Threads mit Frames, Iframes und Scrollbalken im Subject...
      Bitte keine Mails mit Fachfragen - dafuer gibt es das Forum!
      1. benutze einen temporären Table inden du die 50 Ergebnisse einfügst und dort neu - sortiert ausließt.

        mfG Markus

  3. Hello Manuel,

    genau an einer solchen Lösung stricke ich seit längerer Zeit und habe die Aufgabe nun mal endlich ganz oben auf meinem Zettel stehen, bzw. habe sie begonnen.

    Die Schwierigkeit dabei sind das
    1. Duplicate-Management
    2. Rückwärtsblättern.

    Allerdings habe ich die Lösung auf dem Papier bereits und vorwärts auch schon realisiert. Rückwärts kommt über die Feiertage dran. da kenn ich nix. Schließlich gibts schon einen Kunden, der für die Implementierung in seine Site ordentlich was zahlen wird.

    Man braucht dafür entweder Sessions oder muss einen ziemlichen Klotz an Steuervariablen per hidden-Field mit sich rumschleppen.

    Liebe Grüße aus http://www.braunschweig.de

    Tom

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen