Olli: Mssql funzt nicht mit Limit

Hallo,

ich habe da mal ein Problem, auf das ich im Netz noch auf keine richtige Loesung gestossen bin. Es gibt zwar mssql_data_seek, aber ich weiss nicht wie ich es einbinden soll.

Also von Anfang an.
Ich habe da eine Abfrage.

$query = "Select *from tblTest";
$result = mssql_query($query);
$num = mssql_num_rows($result);

for($i=0;$i<$num; $i++)
{
$spalte1 = mssql_result($result,$i, "spalte1");
$spalte2 = mssql_result($result,$i, "spalte2");
$spalte3 = mssql_result($result,$i, "spalte3");

print "$spalte1, $spalte2, $spalte3}

Die Ausgabe des Ergebnisses, will ich aber pro Seite auf 10 begrenzen. Mit einer MySql Datenbank geht das Mit Limit 5,10. Das kann aber MSSQL nicht.
Wie muss ich den nun mit mssql_data_seek arbeiten. Im PHP Manual steht ja nur "springt zum angegebenen Datensatz." Toll, aber auch da keine Ahnung.

Es waere toll wenn mir jemand helfen koennte. Villeicht gibt es auch eine andere Moeglichkeit.

Danke im Vorraus.
Gruss
Olli

  1. Hallo Olli,

    AdoDB kann solche Sachen emulieren, das waere eine einfache und auch flexible Loesung. Ich hab das bei MSSQL nie probiert, wohl aber bei anderen DBs, die Limit nicht kennen.

    Dieter

  2. Hello,

    Die Ausgabe des Ergebnisses, will ich aber pro Seite auf 10 begrenzen. Mit einer MySql Datenbank geht das Mit Limit 5,10. Das kann aber MSSQL nicht.

    mssql kennt kein limit, sondern nur "top". Es gibt auch mMn überhaupt keine Entsprechnung für "offset". das muss man bei mssql über einen geeignetn Kombinations-Index und den Aufsetzpunkt emulieren.

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

    Tom

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    1. Jau, das LIMIT nicht geht hatte ich ja geschrieben. In einigen Foren wird darueber gesprochen, das mann das mit data_seek machen kann, ich weiss nur nicht wie. Irgendwie , soll man eine Schleife machen und mit data_seek auf die Datensaetze springen. Ja aber wie.

      Gruss
      Olli

      1. Hello,

        Jau, das LIMIT nicht geht hatte ich ja geschrieben. In einigen Foren wird darueber gesprochen, das mann das mit data_seek machen kann, ich weiss nur nicht wie. Irgendwie , soll man eine Schleife machen und mit data_seek auf die Datensaetze springen. Ja aber wie.

        Es gibt da prinzipiell zwei Vorgehensweisen:

        Man holt bei jedem Zugriff alle Sätze bzw. deren IDs ab, die einem Filterkriterium entsprechen. Also
        Snapshot-Verfahren:
        -------------------

        select ID_adresse from adresse where plz like '28%' and betrag > 0;

        Ergibt die Liste der IDs aus der Adressdatei, sagen wir mal 112 Adressen. Die IDs werden in einer Session zwischengespeichert. Nun kannst Du ja Seite für Seite aufbauen, indem Du dann jeweils nochemal soviele Einzelstatements für die gesamten Datensätze absetzt über die ID, wie Du Datensätze auf der Seite anzeigen willst.

        Bei kleinen Datensätzen kann man auch die ganzen Datensätze abholen und zwischenspeichern.

        Beim Blättern wird dann nur noch im Userspeicher (Session) gearbeitet. Das entlastet die Datenbank und sichert die gesamte Abfrage während des gesamten Vorganges. Sätze, die sich während der Bearbeitung durch andere User verändern, hinzukommen, oder gelöscht wurden werden hier nicht in der Liste aktualisiert (deshalb Snapshot). das Erfahren erfordert daher i.d.R. einen Conflict-Counter, der beim Zurückschreiben der Daten vom DBMS nochmals verglichen wird und automatisch bei jedem Schreibvorgang hochgetzt wird. Stimmt der Counter nicht mehr überein, lehnt das DBMS ein Update oder delete ab.

        Dynaset-Verfahren:
        -----------------
        Nur die in der Seite anzuzeigenden Datensätze werden gelesen. Dafür benötigt man allerdings dann LIMIT oder TOP. Der Aufsetzpunkt, von dem ab gelesen wird, wird jedes Mal neu bestimmt, indem man den letzten gelesen Schlüssel für die gültige Sortierung aus der Tabelle als Argument für den Vergleich nimmt.

        select $fields from adresse where plz like '28%' and betrag > 0
            and $schluessel > vergleichsfeld top $anzahl
            order vergleichsfeld,ID_adresse;

        Das Verfahren hat einen Haken. Der Index im Vergleichsfeld muss unique sein oder man muss ihn durch Kombination mit einem Primärschlüssel küstlich Promär machen, da man sich bei Duplicates sond Aufhängen könnte, oder Datensätze vergessen könnte. Man kann eine Kombination aus dem Schlüsselfeld und der ID bilden, Das funktioniert meistens. Die Sortierung muss immer über das (Hilfs-)Vergleichsfeld gehen.

        Man muss sich zum Vor- und Zurückblättern immer den ersten Vergleichsfeldwert und den letzten merken. Sätze, die durch andere User während der Bearbeitung in den Scope des Filters rücken, werden hier berücksichtigt.

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

        Tom

        --
        Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
      2. hi,

        Jau, das LIMIT nicht geht hatte ich ja geschrieben. In einigen Foren wird darueber gesprochen, das mann das mit data_seek machen kann, ich weiss nur nicht wie.

        das wurde dir doch hier http://php-resource.de/forum/showthread.php?threadid=4100&perpage=10&pagenumber=2 auf deine frage hin bereits sehr detailiert erklärt.
        also warum bitte fragst du nicht dort weiter, wenn noch etwas unklar ist, anstatt hier die ganze geschichte von vorne aufzurollen?

        gruss,
        wahsaga