Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: wyciagniecie ostatnich wierszy z wyniku zapytania
Forum PHP.pl > Forum > Bazy danych > MySQL
sobstel
PROBLEM

wyciągnięcie ostatnich X wierszy z wyniku zapytania (cos jak limit ale dla ostatnich, a nie pierwszych wierszy)

przykladowo
  1. SELECT *
  2. FROM posts
zwraca 1000 wierszy, a ja chcialbym tak skonstruowane zapytanie, ktory zwrociloby np. 50 ostatnich wierszy z tego co zwraca w/w zapytanie...


ROZWIĄZANIE

1. mozna uzyc DESC a potem po stronie php posortowac z powrotem we wlasciwej kolejnosci, ale to dla mnie kombinowanie, nie licząc narzutu...

2. mozna zrobic najpierw SELECT COUNT(*) a potem 2-gie wlasciwie zapytanie podstawiajac w LIMIT otrzymany COUNT(*) minus ilość wierszy do wyciągnięcia. ale to ciagle 2 zapytania.

bylbym rad gdyby dalo sie to jakos zrobic w jednym zapytaniu. ma ktos jakies pomysly?
mike
  1. SELECT *
  2. FROM tabela ORDER BY id DESC LIMIT x


A potem array_reverse().

Co w tym złego :?:
sobstel
Cytat(mike_mech @ 2005-12-01 20:40:33)
  1. SELECT *
  2. FROM tabela ORDER BY id DESC LIMIT x


A potem array_reverse().

Co w tym złego :?:

powiedzmy, ze chce wyciagnac ostatnich 1000 wierszy. najpierw sortowanie po stronie SQL a potem array_reverse jest stosunkowo kosztowne - zdecydowanei zalatwienie tego jednym zapytaniem byloby o niebo wydajniesz - pytanie czy sie da?
dr_bonzo
No pewnie ze wydajniejsze - znajdz takie.
Mozna by przechowywac ilosc rekordow w innym rekordzie i potem
  1. SELECT ... LIMIT t.ilosc_rekordow - 1000, t.ilosc_rekordow

ale nie wiem czy SQL to przyjmie

----
Cytat
(...)A potem array_reverse().
Co w tym złego :?:

Cytat
powiedzmy, ze chce wyciagnac ostatnich 1000 wierszy. najpierw sortowanie po stronie SQL a potem array_reverse jest stosunkowo kosztowne

Co do sortowania: i tak zawsze* sortujesz
  1. SELECT *
  2. FROM tab ORDER BY id ASC/DESC

wiec kierunek nie ma znaczenia, a array_reverse() jest prosta funkcja/szybka - O( n ).

*) Jedynie gdy nie wykonujesz zadnego sortowania
  1. SELECT *
  2. FROM tab

stracisz na tej metodzie -- ale kiedy uzyjesz tego SQLa??, kolejnosc dodawania rekordow nie musi byc odzwierciedlana przez ich kolejnosci przy takim zapytaniu.
SongoQ
  1. SELECT
  2. *
  3. FROM ( SELECT *
  4. FROM tabela ORDER BY id DESC LIMIT x
  5. )
  6. ORDER BY id ASC
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.