• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Zapytanie SQL

Aruba Cloud VPS - 50% taniej przez 3 miesiące!
0 głosów
215 wizyt
pytanie zadane 25 kwietnia 2018 w SQL, bazy danych przez Boreal Nowicjusz (150 p.)

Hej,

Mam tabele id | title | description | category i wywołuję zapytanie:

SELECT * FROM `tabela` WHERE category = 1

Chciałbym z rezultatu tego zapytania wyciągnąć wiersze np. od 10 do 19. 

Jakiś pomysł jak to zrobić? Czy jest opcja dodania czegoś do tego zapytania czy dopiero później będę musiał wyciągnąć te wiersze w php?

2 odpowiedzi

+2 głosów
odpowiedź 26 kwietnia 2018 przez Chess Szeryf (76,710 p.)
wybrane 27 kwietnia 2018 przez Boreal
 
Najlepsza

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 |
+----+-----------------+

+2 głosów
odpowiedź 25 kwietnia 2018 przez CenterPL Pasjonat (19,070 p.)
LIMIT i OFFSET Ci pomogą ;)

https://www.petefreitag.com/item/451.cfm
komentarz 25 kwietnia 2018 przez Boreal Nowicjusz (150 p.)
Dzięki tego szukałem

Podobne pytania

0 głosów
1 odpowiedź 259 wizyt
pytanie zadane 22 lutego 2017 w SQL, bazy danych przez kacperl95 Obywatel (1,980 p.)
+1 głos
1 odpowiedź 230 wizyt
pytanie zadane 24 października 2015 w SQL, bazy danych przez sliwka92 Nowicjusz (240 p.)
0 głosów
0 odpowiedzi 378 wizyt
pytanie zadane 12 kwietnia 2022 w SQL, bazy danych przez Piotr Popławski Użytkownik (610 p.)

93,112 zapytań

142,092 odpowiedzi

321,632 komentarzy

62,453 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...