Megoldva - MariaDB és az utolsó 2 sor

Erőt Egészséget!

Belefutottam egy hibába, vagy valamit én nem értek megfelelően. Segítsetek legyetek kedvesek! Debian11-en alap csomagokkal próbálkozom.

Készítsünk egy test nevű táblát, aminek egy sora van ami egy szám.
CREATE OR REPLACE TABLE test (i INT);

Töltsél bele adatot:
INSERT INTO test VALUES (1),(2),(3),(4),(5),(6);

Ez a lekérdezés lefut:
SELECT * FROM test LIMIT 2 OFFSET 4;

Ez is megfelelő:
SELECT COUNT(i)-2 FROM test;

A két lekérdezést kombinálva viszont 1064-es sytax hibát kapok.
SELECT * FROM test LIMIT 2 OFFSET (SELECT COUNT(i)-2 FROM test);

A teljes hiba:
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '(SELECT COUNT(i)-2 FROM test)' at line 1

select VERSION();
10.5.18-MariaDB-0+deb11u1

Na de miért?
Kösz;)
vfero

Hozzászólások

START TRANSACTION;
SET @offset = (SELECT COUNT(i)-2 FROM test);
PREPARE statement FROM 'SELECT * FROM test LIMIT 2 OFFSET ?';
EXECUTE statement USING @offset;
COMMIT;

Szerkesztve: 2023. 03. 14., k – 18:08

Lekéstem :)  ...de most már berakom

START TRANSACTION;
SET @_page_from = 2;
SET @_page_size = (SELECT COUNT(i)-2 FROM test);
PREPARE stmt FROM "select i from test limit ?, ?;";
EXECUTE stmt USING @_page_from, @_page_size;
DEALLOCATE PREPARE stmt;
COMMIT;

Bővebben a manualban (az OFFSETre ugyanez igaz): 

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.

Szerkesztve: 2023. 03. 14., k – 18:52

Mondjuk rendezés nélkül eleve sok értelme nincs a LIMIT, OFFSET párosnak, ugyanis nem specifkált, hogy milyen sorrendben ad vissza egy SELECT adatokat. És akkor meg már a megfelelő ORDER, OFFSET=0, LIMIT=2-vel mindig megkapod a valamilyen sorrend szerinti utolsó két sort.