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
- 321 megtekintés
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;
- A hozzászóláshoz be kell jelentkezni
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
- A hozzászóláshoz be kell jelentkezni
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;
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
Ez evidens, de a példa egyszerűsége kedvéért ezt kihagytam. ;)
vfero
- A hozzászóláshoz be kell jelentkezni
De ha nem hagyod ki, írhatsz konstanst és máris helyes szintakszis lesz, és nem kell ilyen topikot nyitni.
- A hozzászóláshoz be kell jelentkezni
az az értelme hogy az adott pilanatban a tranzakció által látott elemeken végigmegy, nem lesz ismétlődő sor.
zászló, zászló, szív
- A hozzászóláshoz be kell jelentkezni
Ezt nem értem. Azt viszont tudom, ha nincs rendezve akkor sorrend és az elemek kb random lesz.
- A hozzászóláshoz be kell jelentkezni