Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]Sortowanie tylko wczytanych wyników
Forum PHP.pl > Forum > Przedszkole
wbeatn
  1. if(isset($_GET['sortuj']) and $_GET['sortuj'] == "desc") {$sortby = "DESC";}
  2. elseif(isset($_GET['sortuj']) and $_GET['sortuj'] == "asc") {$sortby = "ASC";}
  3. else { $sortby = ""; }
  4.  
  5. $od = (($strona*5)-5);
  6. @$rezultat6 = "SELECT id_ladunku, id_pojazdu FROM data_ladunki_pojazdy ORDER BY data_zgloszenia $sortby, godzina_zgloszenia $sortby LIMIT $od, 5";
  7. @$wynik6 = mysql_db_query($baza,$rezultat6);
  8. $odlicz = 1;
  9. while(@$row6 = mysql_fetch_row($wynik6))
  10. {
  11. /* (...) */
  12. }
  13. $odlicz++;
  14. if($odlicz==6) break;
  15. }


Dlaczego przy takim kodzie gdy wywołuje w adresie sortowanie sortuje całą tabelę ze wszystkimi w niej wpisami, a nie tylko to co wczytało? Wpisów w niej jest prawie czterysta. Kiedy sortuje do malejąco, to jako pierwsza pozycja wskakuje ostatni z tych prawie czterystu, a nie ostatni z wczytanych pięciu. Jak to zrobić?
Crozin
Ponieważ tak działa SQL - najpierw występuje sortowanie (ORDER BY), potem dopiero ograniczenie zbioru wyników (LIMIT). I jest to jedyne sensowne rozwiązanie, bo o ile jawnie nie określisz sortowania rekordów, dane zwracane są w kolejności losowej*. To skutkuje tym, że dokładnie to samo zapytanie (bez sortowania) może zwrócić zupełne różne wyniki za każdym razem.

1. Upewnij się jedynie, że masz indeks założony na kolumny data_zgloszenia i godzina_zgloszenia (notabene, to powinna być raczej jedna kolumna) i zostaw zapytanie tak jak je masz.
2. To o co pytasz mógłbyś wymusić podzapytaniem:
  1. SELECT * FROM (
  2. SELECT id_ladunku, id_pojazdu FROM data_ladunki_pojady ORDER BY questionmark.gif?
  3. ) ORDER BY data_zgloszenia, godzina_zgloszenia;

3. Podaj więcej szczegółów, jeżeli powyższe dwa są nieodpowiednie.

* tak na dobrą sprawę trzeba przyjąć - różne bazy przy różnych zapytaniach przy różnej ilości danych będą zachowywać się inaczej.
wbeatn
Cytat(Crozin @ 14.08.2014, 06:30:37 ) *
1. Upewnij się jedynie, że masz indeks założony na kolumny data_zgloszenia i godzina_zgloszenia (notabene, to powinna być raczej jedna kolumna) i zostaw zapytanie tak jak je masz.


Nie wiem czy miałem :) Wiem, że w phpMyAdmin obu kolumnom w zakładce Struktura "dodałem indeks" z menu rozwijanego "więcej" (na końcu tej tabeli przy każdym wersie jest taka opcja)

Cytat(Crozin @ 14.08.2014, 06:30:37 ) *
2. To o co pytasz mógłbyś wymusić podzapytaniem:
  1. SELECT * FROM (
  2. SELECT id_ladunku, id_pojazdu FROM data_ladunki_pojady ORDER BY ???
  3. ) ORDER BY data_zgloszenia, godzina_zgloszenia;


To zapytanie zwraca na stronie pusty wynik.

Cytat(Crozin @ 14.08.2014, 06:30:37 ) *
3. Podaj więcej szczegółów, jeżeli powyższe dwa są nieodpowiednie.


Niestety nie wiem co mógłbym jeszcze podać. Wydaje mi się, że wszystko co niezbędne jest we wklejonym przeze mnie kodzie PHP. Reszta kodu, myślę, w żaden sposób nie łączy się z tym co ma wczytać zapytanie. Może jakaś wskazówka?

Naprawdę nikt nie jest w stanie mi pomóc? Nie wierzę, że możliwości PHP i MySQL mogą być ograniczone w tak wydawałoby się nieskomplikowanej sprawie.
Crozin
Cytat
To zapytanie zwraca na stronie pusty wynik.
Zapewne wyrzuca jakiś błąd, ale Ty wszystkie błędy sobie ukrywasz... pozbądź się "@" oraz funkcji mysql_* na rzecz PDO, albo chociaż korzystaj z mysql_error.

Jak już napisałem: sortowanie (ORDER BY) występuje przed wycięciem (OFFSET ... LIMIT ...) rekordów. Jeżeli chcesz wymusić odwrotne działanie musisz skorzystać z zapytania, które podałem w pkt. 2.
aniolekx
czy nie prościej było by użyć: http://datatables.net/
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.