+ Antworten
Ergebnis 1 bis 8 von 8

Thema: Wiki Beitrag LIMIT

  1. #1
    User Halbes Megabyte Themenstarter
    Avatar von Crian
    Registriert seit
    02.08.2013
    Fachbeiträge
    552
    Genannt
    32 Post(s)
    Ich wollte gerade auf der Diskussionsseite des Beitrags LIMIT eine Frage stellen, aber ich darf im Wiki gar nicht schreiben. Muss man sich dafür irgendwie noch gesondert anmelden?

    Es steht dort:
    SQL Code:
    1. SELECT * FROM testtable WHERE id >1 ORDER BY id LIMIT 10,30

    Diese Abfrage wählt 10 Elemente aus, jedoch werden diese nicht vom Anfang genommen, sondern erst ab dem 30.Element. Dies bedeutet wenn die id von 1-100 eindeutig durchnummeriert ist, werden die Elemente 30-40 ausgegeben.
    Ich frage mich nun, sollte es nicht "werden die Elemente 30-39 ausgegeben" heißen? 30 bis 40 wären ja elf Zeilen.



    Off topic:
    Gefunden hatte ich die Seite übrigens über die Google-Suche nach "SQL LIMIT".




    Edit:

    Nach weiterer Suche fand ich auf der Seite https://dev.mysql.com/doc/refman/5.5/en/select.html:

    With two arguments, the first argument specifies the offset of the first row to return, and the second specifies the maximum number of rows to return. The offset of the initial row is 0 (not 1):

    SQL Code:
    1. SELECT * FROM tbl LIMIT 5,10;  # Retrieve rows 6-15
    Das scheint mir doch in einigem Widerspruch zu unserer Wikiseite zu stehen.
    Nach eigenen Tests auf der hier verwendeten MySQL-Datenbank unter der MySQL Workbench scheint die MySQL-Seite da durchaus Recht zu haben.

    SQL Code:
    1.           SELECT *
    2.             FROM `datenbank`.`tabelle`
    3.             ORDER BY id
    4.             LIMIT 0, 10;

    sucht die ersten zehn Zeilen heraus (und nicht 0 Zeilen ab Zeile 11).

    Analog funktioniert erfreulicher Weise auch

    SQL Code:
    1.         SELECT *
    2.             FROM `datenbank`.`tabelle`
    3.             ORDER BY id
    4.             LIMIT 10 OFFSET 0;

    Dann muss man sich einfach nicht merken, welcher Parameter nun wofür stand.
    Geändert von Crian (03.01.2017 um 09:44 Uhr)

  2. #2
    Global Moderator Viertel Gigabyte
    Registriert seit
    05.08.2008
    Fachbeiträge
    4.967
    Genannt
    325 Post(s)
    Ganz oben rechts sollte ein sehr kleines "Anmelden" sein, wo man sich mit dem gleichen Login wie hier im Forum einloggen können sollte.

    Hab's gerade mal geändert, ich hoffe, dass es jetzt stimmt: https://wiki.byte-welt.net/wiki/Limit_(SQL)

    Die Einteilung der Seite würde ich so verstehen, dass dieses "OFFSET" nicht bei allen SQL-Dialekten funktioniert...?! Aber ich hab' keine Ahnung von DB, deswegen kann ich da aus dem Stand nichts fundiertes sagen...

  3. #3
    Global Moderator Viertel Gigabyte Avatar von SlaterB
    Registriert seit
    06.08.2008
    Fachbeiträge
    2.716
    Genannt
    292 Post(s)
    hier mal eine Quelle die wieder den urspünglichen Stand nennt (für MySQL):
    PHP Limit Data Selections From MySQL

    ich selber habe gerade PostgreSQL und das erlaubt keine zwei Parameter bei Limit, nur Offset, wohl das Beste so..


    ---------

    Zitat Zitat von Crian Beitrag anzeigen
    Nach eigenen Tests auf der hier verwendeten MySQL-Datenbank unter der MySQL Workbench scheint die MySQL-Seite da durchaus Recht zu haben.

    SQL Code:
    1.           SELECT *
    2.             FROM `datenbank`.`tabelle`
    3.             ORDER BY id
    4.             LIMIT 0, 10;

    sucht die ersten zehn Zeilen heraus (und nicht 0 Zeilen ab Zeile 11).

    Analog funktioniert erfreulicher Weise auch

    SQL Code:
    1.         SELECT *
    2.             FROM `datenbank`.`tabelle`
    3.             ORDER BY id
    4.             LIMIT 10 OFFSET 0;

    Dann muss man sich einfach nicht merken, welcher Parameter nun wofür stand.
    wieso ist das erfreulich analog?

    0 und 10 sind vertauscht, LIMIT 10, 0 wäre ja wohl nicht schlechter aufgeschrieben,

    bei OFFSET wäre OFFSET 0 LIMIT 10 auch nicht schlimm,
    weitere Varianten kaum vorstellbar

    ------

    mit dem Problem einmal in der Welt kann man sich eh nirgendwo mehr sicher sein,
    was Parameter 1 und 2 von LIMIT bedeuten

    es gibt keine gute Lösung mehr, außer konsequent OFFSET zu verwenden,
    oder mit einem Schlag alle DBs (sofern nötig) und alle Tutorials (anscheinend nötig) gleichgeschaltet
    Geändert von SlaterB (03.01.2017 um 15:43 Uhr)
    Hansa wird Meister

  4. #4
    User Kilobyte Avatar von vfl_freak
    Registriert seit
    01.08.2013
    Ort
    Osnabrück
    Fachbeiträge
    210
    Genannt
    9 Post(s)
    Moin,
    Zitat Zitat von Crian Beitrag anzeigen
    Ich frage mich nun, sollte es nicht "werden die Elemente 30-39 ausgegeben" heißen? 30 bis 40 wären ja elf Zeilen.
    Eins von beiden ('30' oder '40') war dann wohl ein Tippfehler

    Also lt. API (https://dev.mysql.com/doc/refman/5.7/en/select.html) müsste es dann wohl 31-40 sein !!

    The LIMIT clause can be used to constrain the number of rows returned by the SELECT statement. LIMIT takes one or two numeric arguments, which must both be nonnegative integer constants, with these exceptions:

    Within prepared statements, LIMIT parameters can be specified using ? placeholder markers.

    Within stored programs, LIMIT parameters can be specified using integer-valued routine parameters or local variables.

    With two arguments, the first argument specifies the offset of the first row to return, and the second specifies the maximum number of rows to return. The offset of the initial row is 0 (not 1)
    Gruß Klaus
    Der Pessimist sagt: "Schlimmer kann es nicht mehr werden ..." - Der Optimist sagt: "DOCH, es kann!!"

  5. #5
    User Halbes Megabyte Themenstarter
    Avatar von Crian
    Registriert seit
    02.08.2013
    Fachbeiträge
    552
    Genannt
    32 Post(s)
    Zitat Zitat von vfl_freak Beitrag anzeigen
    The offset of the initial row is 0
    Das klingt für mich dann eher nach 30 bis 39:

    SQL Code:
    1. SELECT * FROM ... LIMIT 0, 10

    Liefert die ersten zehn Zeilen, also Zeile 0 bis Zeile 9.

    SQL Code:
    1. SELECT * FROM ... LIMIT 10, 10

    Liefert die zweiten zehn Zeilen, also Zeile 10 bis Zeile 19.

    SQL Code:
    1. SELECT * FROM ... LIMIT 20, 10

    Liefert die dritten zehn Zeilen, also Zeile 20 bis Zeile 29.

    SQL Code:
    1. SELECT * FROM ... LIMIT 30, 10

    Liefert die vierten zehn Zeilen, also Zeile 30 bis Zeile 39.

    So passiert es zumindest bei MySQL in der MySQL-Workbench.



    Zitat Zitat von SlaterB Beitrag anzeigen
    wieso ist das erfreulich analog?
    Ich schrieb nicht "erfreulich analog", sondern dass es erfreulicher Weise analog auf die untere Weise funktioniert, die IMHO klar vorzuziehen ist, da man nicht darüber nachdenken muss, was nun die Anzahl der gewünschten Zeilen und was das Offset ist. Dort kann man es auch vertauschen, wie du schon sagtest.

  6. #6
    Global Moderator Viertel Gigabyte
    Registriert seit
    05.08.2008
    Fachbeiträge
    4.967
    Genannt
    325 Post(s)
    *etwas nervös und irritiert zwischen allen diskutierenden hin und her schaut*
    War meine Änderung nun "richtig"?
    Klingt als könnte man die Frage nicht beantworten.... außer durch "Ausprobieren" in speziellen Setups...!?

  7. #7
    Frequent User Megabyte
    Registriert seit
    01.08.2013
    Fachbeiträge
    1.741
    Genannt
    114 Post(s)
    Zitat Zitat von Marco13 Beitrag anzeigen
    War meine Änderung nun "richtig"?
    Ja, so ist es jetzt richtig. Die Dokumentation ist diesbezüglich auch eindeutig und lässt keine Fragen offen. Auch ohne Ausprobieren.

    Edit: verwirrend ist vielleicht, dass im Wiki die Einträge von 1 beginnend durchnummeriert werden, bei der Abfrage der Offset hingegen bei 0 beginnt.

  8. #8
    User Halbes Megabyte Themenstarter
    Avatar von Crian
    Registriert seit
    02.08.2013
    Fachbeiträge
    552
    Genannt
    32 Post(s)
    Zitat Zitat von cmrudolph Beitrag anzeigen
    Edit: verwirrend ist vielleicht, dass im Wiki die Einträge von 1 beginnend durchnummeriert werden, bei der Abfrage der Offset hingegen bei 0 beginnt.
    Vielleicht könnte man das verbessern, indem man statt

    Dies bedeutet wenn die id von 1-100 eindeutig durchnummeriert ist, werden die Elemente 11-40 ausgegeben.
    lieber

    Dies bedeutet, wenn die id von 1-100 eindeutig durchnummeriert ist, werden die Zeilen mit den Ids 11-40 ausgegeben.
    Denn unter "Elemente" verstand ich die Zeilennummern, und die beginnen ja bei 0 (was imho nicht so toll ist, aber so ist es nunmal).

    Zitat Zitat von cmrudolph Beitrag anzeigen
    Ja, so ist es jetzt richtig. Die Dokumentation ist diesbezüglich auch eindeutig und lässt keine Fragen offen. Auch ohne Ausprobieren.
    Ja, das stimmt, allerdings hatte ich zuerst in unser Wiki geschaut, und da war es ja falsch und abweichend von anderer Dokumentation, weswegen ich es dann ausprobiert habe.

+ Antworten Thema als "gelöst" markieren

Direkt antworten Direkt antworten

Gib folgenden Captcha-Code ein: 2X9MD4

Aktive Benutzer

Aktive Benutzer

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)

Ähnliche Themen

  1. Wiki-Beitrag equals
    Von CyborgBeta im Forum Wiki
    Antworten: 4
    Letzter Beitrag: 13.10.2016, 23:51
  2. Limit dockability of certain frames
    Von amirles im Forum DockingFrames
    Antworten: 3
    Letzter Beitrag: 13.06.2012, 00:40
  3. Wiki
    Von EagleEye im Forum Spielwiese
    Antworten: 0
    Letzter Beitrag: 03.01.2007, 19:40

Berechtigungen

  • Neue Themen erstellen: Ja
  • Themen beantworten: Ja
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •