Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Sortowanie malejące, wypisanie rosnące
Forum PHP.pl > Forum > Bazy danych > MySQL
Siela
Chciałbym wypisać 30 największych rekordów, z bazy danych rosnąco. Nie wiem jak temu podołać... jak biorę zapytanie w tym stylu:
  1. <?php
  2. select * from tabela ORDER BY kolumna ASC LIMIT 30
  3. ?>

To pobiera mi rosnąco, ale dane z początku tabeli, a potrzebuje tylko te z końca. Jak korzystam z:
  1. <?php
  2. select * from tabela ORDER BY kolumna DESC LIMIT 30
  3. ?>

To faktycznie mam tylko te dane które mnie interesują, ale jak wypisuje to wypisuję je malejąco zamiast rosnąco...

Nie wiem jakim zapytaniem poprawnie mi posortuje i wybierze dane :/
.radex
  1. <?php
  2. while($wynik = mysql_fetch_object(mysql_query("select * from tabela ORDER BY kolumna DESC LIMIT 30")))
  3. {
  4.  echo $wynik->kolumna;
  5. }
  6. ?>


To co podałeś jest (chyba) ok, najprawdopodobniej źle to wyświetlasz.
Siela
Ale to nie o to chodzi...

Przykładowo
  1. <?php
  2. select * from tablica ORDER BY kolumna DESC
  3. ?>


daje mi taki wynik:

a b c d e f g h i j k l m n

Natomiast:
  1. <?php
  2. select * from tablica ORDER BY kolumna DESC LIMIT 4
  3. ?>


zwraca:

a b c d

A interesują mnie dane:

k l m n
.radex
to zrób jednak ASC i następnie na tablicę która zostanie wygenerowana daj array_reverse.
Siela
  1. <?php
  2. $query='select * from tablica ORDER BY kolumna ASC LIMIT 20';
  3. $wynik=mysql_query($query);
  4. $wynik=array_reverse($wynik);
  5. ?>


Tak? Czy jak? No chyba, że jeszcze:
  1. <?php
  2. while($row=mysql_fetch_array($wynik))
  3. {
  4. $tablica[]=$row;
  5. }
  6. $tablica=array_reverse($tablica);
  7. ?>

Czy może tak?
.radex
Drugi sposób.
Siela
Ale czy to nie będzie zbyt czasochłonne i obciążające dla serwera? Tym bardziej, że to będzie się odświeżało w miarę często... Może lepiej używać
  1. <?php
  2. LIMIT $ilosc_rekordow-20, $ilosc rekordow
  3. ?>


To raczej nie będzie aż takie obciążające... Tylko jak skomponować zapytanie do bazy tego typu?
.radex
Jeśli nie masz dużej ilości rekordów to nie ma co się bawić.

btw. pomogłem?
Shili
W takiej formie drugim zapytaniem. Lepiej chyba stworzyć nawet dwudziestoelementową tablicę.
Siela
Ale to ma być Shoutbox w AJAX`ie więc zapytania i wywołania skryptu będą co kilka, kilkanaście sekund. Więc może obciążać.
.radex
No i co z tego? Skoro ograniczasz za pomocą LIMIT to szuka tylko tych, których potrzebujemy.

Skończyły się czasy, kiedy ludzie się ściagają, kto napisze szybszy program wyświetlający piksel w assemblerze. biggrin.gif
Siela
Weź mnie tu o Assemblerze nie wspominaj ... -.-" Jeszcze się za mną ciągnie to kolejny rok...

W każdym razie mam takie zboczenie biggrin.gif

  1. <?php
  2. SET @a=(SELECT COUNT(*) from tabela)-20;
  3. SET @b=(SELECT COUNT(*) from tabela);
  4. PREPARE STMT from 'select * from tabela ORDER BY nazwa LIMIT ?, ?';
  5. EXECUTE STMT USING @a, @b;
  6. ?>


Może przy wykorzystaniu tych zmiennych SQL`owych?
Shili
Proponuję tylko raz zliczyć COUNT'a i wykorzystać już otrzymaną zmienną. Mimo wszystko ograniczasz zapytania do dwóch.

ps. ETI? winksmiley.jpg
Siela
Yep ETI tongue.gif

W każdym razie to coś nie działa do końca... Jakieś pomysły? Szukam w googlach jakiś materiałów na temat takiego rozwiązania ale nic nie chce znaleźć ciekawego :/
Shili
Równie dobrze możesz to zrobić na phpie (dwa zapytania, chociaż i tak mam wrażenie, że tablica lepiej nadawałaby się do tego celu):
  1. <?php
  2. $query = "zapytanie z count(*)";
  3. $result = mysql_query($query);
  4. $row = mysql_fetch_row($result);
  5. $limitA = row[0];
  6. $limitB = $limitA - 20;
  7. $query = "zapytanie z $limitA i $limitB";
  8. ?>

Chyba, że koniecznie chcesz to zrobić tylko mysql'owo.
Siela
Tzn teraz to już w sumie tylko z ciekawości chce jedynie mysql`owo to zrobić...
Kicok
  1. SELECT * FROM ( SELECT * FROM tabela ORDER BY kolumna DESC LIMIT 30 )
  2. ORDER BY kolumna ASC


Nie wiem czy w dokładnie takiej postaci będzie działać, ale założenie jest chyba jasne.
Siela
  1. SELECT tabela.* FROM ( SELECT * FROM shoutbox ORDER BY `date` DESC LIMIT 30 ) AS tabela ORDER BY `date` ASC


SUPER! biggrin.gif
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.