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;
Köszönöm tsamu! Ez egy kicsit más liga, mint amit én képviselek, de ez valóban hozza a tőle elvártat.
vfero
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;
Köszi ettől függetlenül! ;)
vfero
Bővebben a manualban (az OFFSETre ugyanez igaz):
The
LIMIT
clause can be used to constrain the number of rows returned by theSELECT
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.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.
Ez evidens, de a példa egyszerűsége kedvéért ezt kihagytam. ;)
vfero
De ha nem hagyod ki, írhatsz konstanst és máris helyes szintakszis lesz, és nem kell ilyen topikot nyitni.
az az értelme hogy az adott pilanatban a tranzakció által látott elemeken végigmegy, nem lesz ismétlődő sor.
Gábriel Ákos
Ezt nem értem. Azt viszont tudom, ha nincs rendezve akkor sorrend és az elemek kb random lesz.