Wiki Beitrag LIMIT

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]SELECT * FROM testtable WHERE id >1 ORDER BY id LIMIT 10,30[/SQL]

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.

[ot]Gefunden hatte ich die Seite übrigens über die Google-Suche nach „SQL LIMIT“.[/ot]

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]SELECT * FROM tbl LIMIT 5,10; # Retrieve rows 6-15[/SQL]

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] SELECT *
FROM datenbank.tabelle
ORDER BY id
LIMIT 0, 10;
[/SQL]

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

Analog funktioniert erfreulicher Weise auch

[SQL] SELECT *
FROM datenbank.tabelle
ORDER BY id
LIMIT 10 OFFSET 0;
[/SQL]

Dann muss man sich einfach nicht merken, welcher Parameter nun wofür stand.

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…

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…


[QUOTE=Crian]Nach eigenen Tests auf der hier verwendeten MySQL-Datenbank unter der MySQL Workbench scheint die MySQL-Seite da durchaus Recht zu haben.

[SQL] SELECT *
FROM datenbank.tabelle
ORDER BY id
LIMIT 0, 10;
[/SQL]

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

Analog funktioniert erfreulicher Weise auch

[SQL] SELECT *
FROM datenbank.tabelle
ORDER BY id
LIMIT 10 OFFSET 0;
[/SQL]

Dann muss man sich einfach nicht merken, welcher Parameter nun wofür stand.[/QUOTE]
wieso ist das erfreulich analog? :wink:

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

Moin,

Eins von beiden (‚30‘ oder ‚40‘) war dann wohl ein Tippfehler :smiley:

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

Das klingt für mich dann eher nach 30 bis 39:

[SQL]SELECT * FROM … LIMIT 0, 10[/SQL]

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

[SQL]SELECT * FROM … LIMIT 10, 10[/SQL]

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

[SQL]SELECT * FROM … LIMIT 20, 10[/SQL]

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

[SQL]SELECT * FROM … LIMIT 30, 10[/SQL]

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

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

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.

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…!?

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.

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).

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.