Peter: MySQL: Limit 1000,unendlich möglich?

Tachauch,

gibt es eine bessere Methode, um alle Datensätze außer den ersten xxx (z.B. 42) zu bekommen als

SELECT ... LIMIT xxx, sehrgrossezahl
bzw.
SELECT ... LIMIT 42, 999999999999
?

LIMIT 42,

(also einfach ohne Anzahl) wird nicht akzeptiert.

Bei Verwendung einer großen Zahl besteht ja immer die theoretische Möglichkeit, nicht alle gewünschten Datensätze zu erfassen.

Ok, man könnte natürlich in einem Extra-Select erstmal die Gesamtzahl der Datensätze auslesen und die benutzen.
Aber das ist auch wieder nur sicher, wenn man Transaktionen benutzt, denn es könnte ja ein anderer Prozeß zwischen den beiden Selects neue Datensätze einfügen.

Die ersten xxx Ergebnisse im Programm wegzuschmeißen find ich auch nicht so toll.

Gibt es also eine schlauere, sichere Methode, alle zu erfassen ohne Transaktionen?

bis denne,
Peter

  1. Hi,

    Gibt es also eine schlauere, sichere Methode, alle zu erfassen ohne Transaktionen?

    Ohne LIMIT

    MfG

    1. Tachauch

      Gibt es also eine schlauere, sichere Methode, alle zu erfassen ohne Transaktionen?

      Ohne LIMIT

      Damit bekomme ich aber auch die ersten xxx Datensätze.

      Da xxx durchaus auch mal im 7-stelligen Bereich sein kann, ist das nicht wirklich der Hit. Aber das schrieb ich ja schon, daß das mit dem Wegwerfen der ersten xxx Ergebnisse im Programm nicht so der Hit ist.

      Bis denne,
      Peter

      1. Hi,

        Gibt es also eine schlauere, sichere Methode, alle zu erfassen ohne Transaktionen?

        Ohne LIMIT

        Damit bekomme ich aber auch die ersten xxx Datensätze.

        manche Leute lesen die eigentliche Frage nicht wirklich.

        Da xxx durchaus auch mal im 7-stelligen Bereich sein kann, ist das nicht wirklich der Hit. Aber das schrieb ich ja schon, daß das mit dem Wegwerfen der ersten xxx Ergebnisse im Programm nicht so der Hit ist.

        Entweder Du nimmst tatsächliche eine sehr große Zahl an oder Du machst zwei Requests, wobei Du im ersten die Anzahl der Rows ermittelst.

        Gruß
        Reiner

        1. Tachauch,

          manche Leute lesen die eigentliche Frage nicht wirklich.

          stimmt.

          Entweder Du nimmst tatsächliche eine sehr große Zahl an oder Du machst zwei Requests, wobei Du im ersten die Anzahl der Rows ermittelst.

          Warum ich beides für nicht so toll halte, schrieb ich schon im Ausgangsposting.

          Bis denne,
          Peter

  2. Hi Peter,

    gibt es eine bessere Methode, um alle Datensätze außer den ersten xxx (z.B. 42) zu bekommen als

    SELECT ... LIMIT xxx, sehrgrossezahl
    bzw.
    SELECT ... LIMIT 42, 999999999999
    ?

    Laut dem MySQL Manual -> SELECT -> LIMIT scheint es das nicht zu geben.

    Die Anzahl aller vorhandener Datensätze rauszubekommen ist aber nicht schwierig:

    SELECT count(*) FROM tabelle

    Wenn du eine neuere MySQL Version verwendest (V. >= 4.1), dann sollte das sogar mit einem Sub-Select gehen...

    MfG, Dennis.

    --
    Mein SelfCode: ie:{ fl:( br:> va:) ls:[ fo:) rl:( n4:# ss:) de:] js:| ch:{ sh:| mo:} zu:|
    Wer die FAQ gelesen hat, ist klüger! ... und weiß wie man Links macht ;-)
    1. Tachauch

      Die Anzahl aller vorhandener Datensätze rauszubekommen ist aber nicht schwierig:
      SELECT count(*) FROM tabelle

      Das ist schon klar - erfordert aber dann eine Transaktion, mit der beide SELECTs geklammert werden.

      Wenn du eine neuere MySQL Version verwendest (V. >= 4.1), dann sollte das sogar mit einem Sub-Select gehen...

      Denn leider ist 4.0.18 auf dem Server ...

      Bis denne,
      Peter

  3. gibt es eine bessere Methode, um alle Datensätze außer den ersten xxx (z.B. 42) zu bekommen als

    ich hab grad mal ein bisschen rumgespielt. Was passiert wenn man eine negative Zahl angibt?

    Ich hab grad keine Lust die mysql Doku zu durcvhforsten, aber vielleicht weiß der eine oder andere Fachmann ob das geht.

    Struppi.

    1. Hi Struppi,

      ich hab grad mal ein bisschen rumgespielt. Was passiert wenn man eine negative Zahl angibt?

      Na was jetzt - hast du etwas rumgespielt oder nicht? ;-)

      #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '-1' at line 1

      Mit 0 gibt es zwar keinen Fehler, es funktioniert aber auch nicht.

      Ich hab grad keine Lust die mysql Doku zu durcvhforsten, aber vielleicht weiß der eine oder andere Fachmann ob das geht.

      Hab schon etwas geguckt, aber nichts gescheites gefunden, mit Limit scheit es aber jedenfalls nicht zu gehen, siehe auch mein anderes Posting.

      MfG, Dennis.

      --
      Mein SelfCode: ie:{ fl:( br:> va:) ls:[ fo:) rl:( n4:# ss:) de:] js:| ch:{ sh:| mo:} zu:|
      „Von rechts ein Trabbi und von links auch frei!” *g*
      1. ich hab grad mal ein bisschen rumgespielt. Was passiert wenn man eine negative Zahl angibt?

        Na was jetzt - hast du etwas rumgespielt oder nicht? ;-)

        #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '-1' at line 1

        oops - sorry, in phpmyadmin ging's, da wird offensichtlich der Wert gefiltert.

        Struppi.

        1. Hi Struppi,

          oops - sorry, in phpmyadmin ging's, da wird offensichtlich der Wert gefiltert.

          Hm, ich habe es auch in PHPMyAdmin eingegeben... MySQL Version? 4.1.10

          MfG, Dennis.

          --
          Mein SelfCode: ie:{ fl:( br:> va:) ls:[ fo:) rl:( n4:# ss:) de:] js:| ch:{ sh:| mo:} zu:|
          Man sollte nie aufhören zu fragen (Albert Einstein)
          ... aber natürlich erst, nachdem man sämliche FAQ's und Archive durchgelesen hat :-P
          1. oops - sorry, in phpmyadmin ging's, da wird offensichtlich der Wert gefiltert.

            Hm, ich habe es auch in PHPMyAdmin eingegeben... MySQL Version? 4.1.10

            MySQL 4.0.24, phpAdmin 2.6.1-pl2 - beim Hoster
            Lokal krieg ich auch den Fehler.

            Struppi.

            1. Hallo Struppi

              oops - sorry, in phpmyadmin ging's, da wird offensichtlich der Wert gefiltert.

              Hm, ich habe es auch in PHPMyAdmin eingegeben... MySQL Version? 4.1.10

              MySQL 4.0.24, phpAdmin 2.6.1-pl2 - beim Hoster
              Lokal krieg ich auch den Fehler.

              Struppi.

              Struppi.

  4. Tachen,

    es scheint wirklich keine bessere Möglichkeit zu geben. Siehe dazu auch folgenden Auszug aus der offiziellen MySQL-Dokumentation.

    [...]
    To retrieve all rows from a certain offset up to the end of the result set, you can use some large number for the second parameter. This statement retrieves all rows from the 96th row to the last:

    mysql> SELECT * FROM table LIMIT 95,18446744073709551615;
    [...]

    Viele Grüße
    David

  5. yo,

    Ok, man könnte natürlich in einem Extra-Select erstmal die Gesamtzahl der Datensätze auslesen und die benutzen.
    Aber das ist auch wieder nur sicher, wenn man Transaktionen benutzt, denn es könnte ja ein anderer Prozeß zwischen den beiden Selects neue Datensätze einfügen.

    die beiden selects sollten so schnell gehen, dass da nicht wirklich viel passiert. und selbst wenn, ist das nicht weiter tragisch, du hast keinen wirklichen nachteile gegenüber nur einer abfrage. stell die vor, du könntst es mit einer abfrage lösen. in der zeit, bis du die ergebnisse siehst, bis dahin vergeht auch immer einer wenig zeit, wo andere prozeese durchaus auch einen datensatz anfügen könnten. und den würdest du dann auch nicht sehen, obwohl er mit erscheinen deiner daten schon vorhanden ist. die select abfrage ist nun mal nur eine momentaufnahme, egal ob mit einer oder zwei abfragen. also mach das ruhig mit den zwei abfragen.

    Ilja