https://dev.mysql.com/doc/refman/5.5/en/limit-optimization.html
https://dev.mysql.com/doc/refman/8.0/en/create-view.html
https://dev.mysql.com/doc/refman/5.5/en/select.html
MariaDB [turqus]> select * from zdjecia;
+----+------------------+
| id | zdjecie |
+----+------------------+
| 1 | http://costam.pl |
| 2 | rabbit3_top.png |
| 3 | rabbit3_top.png |
| 4 | js.png |
| 5 | mozilla.png |
| 6 | project.png |
| 7 | js.png |
| 8 | js.png |
| 9 | js.png |
| 10 | js.png |
| 11 | js.png |
| 12 | js.png |
+----+------------------+
12 rows in set (0.00 sec)
Jeśli chcesz wyciągnąć z tabeli np. rekordy o id 4 i 5, to wpisujesz takie polecenie:
delimiter //
select * from zdjecia limit 3,2//
CenterPL nadmienił też coś o OFFSET (dobrze, że o tym wspomniał), więc dam przykład:
(select * from zdjecia limit 2 offset 3)//
Zarówno w pierwszym jak i drugim przykładzie rezultat jest następujący:
+----+-------------+
| id | zdjecie |
+----+-------------+
| 4 | js.png |
| 5 | mozilla.png |
+----+-------------+
W pierwszym przykładzie pierwsza wartość w LIMIT oznacza od którego wiersza zacząć pobierać rekordy (liczy od zera). Druga wartość zaś znaczy "ile rekordów wziąć po rekordzie ustawionym jako pierwsza wartość w LIMIT" (pytanie retoryczne (chyba)).
Drugi przykład mówi, żeby "index" zszedł na wiersz numer 3 (OFFSET, liczy od zera) i aby wziął tylko 2 następne wiersze.
To teraz czas na trochę bardziej "zaawansowane" rzeczy, a mianowicie funkcje i procedury; przykład(y):
create or replace function alpha(q int,w int)
returns char(50) DETERMINISTIC
return concat(q,',',w-q+1)//
create or replace procedure crocodile3(in jj varchar(70),in xx int,in yy int,in ll varchar(40))
begin
set @cc = (select alpha(xx,yy));
set @aa = (select substring_index(@cc,',',1));
set @bb = (select substring_index(@cc,',',-1));
set @cnc = (concat(jj,' limit ?',',','?',ll));
if xx=-1 and yy=-1
then
set @hh = concat(jj,' ',ll);
prepare stmt from @hh;
execute stmt;
else
set @hh = @cnc;
prepare stmt from @hh;
execute stmt using @aa,@bb;
end if;
end//
call crocodile3('(SELECT * FROM zdjecia',-1,-1,') order by id desc')//
Jako, że w MySQL nie ma argumentów opcjonalnych, chyba że o czymś nie wiem, to na napisanie ich poradziłem sobie w ten sposób, że jak będzie -1 w argumencie numer 2 i 3 licząc od jeden, to niech skrypt działa poprawnie, żeby się nie "wywalał", tylko szedł dalej do argumentu numer 4.
Działanie skryptu:
Syntax:
call crocodile3('any_expr',x>-1 or x=-1,x>-1 or x=-1,'any_expr')//
call crocodile3('(SELECT * FROM zdjecia limit 3)',-1,-1,' order by id desc')//
call crocodile3('(SELECT * FROM zdjecia ',0,2,') order by id desc')//
+----+------------------+
| id | zdjecie |
+----+------------------+
| 3 | rabbit3_top.png |
| 2 | rabbit3_top.png |
| 1 | http://costam.pl |
+----+------------------+
Jeśli chcesz skorzystać z tej procedury to możesz zapisać ten kod jako np. sql_my.sql, a następnie przy pracy z SQL zaimportować to z pliku i gotowe. Procedura ta wyciąga wartości z rekordów od, do. Np. jeśli chcesz wyciągnąć wartości od 9 do 11, to wpisujesz to:
call crocodile3('SELECT * FROM zdjecia ',8,10,'')//
+----+---------+
| id | zdjecie |
+----+---------+
| 9 | js.png |
| 10 | js.png |
| 11 | js.png |
+----+---------+
Dlatego 8 i 10, bo liczymy od zera (0). Jesli chciałbyś mieć tak, żeby liczyło od jeden (1), to możesz przecież przerobić ten kod, odpowiada za to bodajże ta linia:
return concat(q,',',w-q+1)//
https://dba.stackexchange.com/questions/69537/limit-1000-25-vs-limit-25-offset-1000
select * from zdjecia where (length(zdjecie))=15 limit 1//
call crocodile3('SELECT * FROM zdjecia2 where (length(zdjecie))=15 ',0,0,'')//
+----+-----------------+
| id | zdjecie |
+----+-----------------+
| 2 | rabbit3_top.png |
+----+-----------------+