Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]sortowanie losowe
Forum PHP.pl > Forum > Przedszkole
tomputer
Witam,
Pisze w dziale przedszkole bo idealnie opisuje to mój poziom wiedzy na temat programowania.
Próbuję przerobić pewien skrypt tak by wyświetlał mi losowo wpisy:
Obecnie sortowanie jest ustawione malejąco ale zastanawiam się czy mogę tą funkcję dla klasy przerobić na sortowanie losowe.
  1.  
  2. private function testSort()
  3. {
  4.  
  5. $sort = 'id DESC';
  6. if ($this->param('sort', 'id DESC') != 'id DESC') {
  7. $this->view->urls['sort'] = $this->param('sort', 'id DESC');
  8. $sort = $this->view->urls['sort'];
  9. }
  10.  
  11. return $sort;
  12. }
YourFrog
Z twojego postu można wywnioskować że jest to sortowanie po stronie bazy danych. Przemilczę czy ma to sens w taki sposób jaki zaprezentowałeś (sql injection itp.), a swoją odpowiedzią skupie się tylko na sortowaniu w bazie danych.

Ogólnie NIE ZALECA SIĘ sortowania przez jakiś random w zapytaniu SQL z powodu bardzo powolnego działania takiego algorytmu. Co można w takim razie zrobić? Otóż bardzo prostą sztuczkę w zależności od tego jak wyglądają wartości w PK twojej tabeli:

- PK Auto increment + brak dziur
* Sprawa najłatwiejsza bo pobierasz sobie minimum i maksimum wartości z kolumny, a później losujesz liczbę z tego przedziału i limit + offset w zapyaniu załatwi sprawę + order by na PK ASC.

- PK Auto increment + dziury
* Sprawa trochę trudniejsza bo musisz pobrać ilość elementów na bazie później z przedziału 0 - max wylosować liczbę i pobrać tak samo jak w poprzednim punkcie

- PK jest jakimś typem który się nie sortuje
* Nie da się bez RAND w bazie

- Widok zmaterializowany
* Baza nadal będzie miała problemy jednak dla klienta wyniki będą instant smile.gif Odpalasz w cronie o jakieś godzinie generowanie widoku zmaterializowanego który posortuje wyniki po RAND() w order by (Tutaj zadziała Ci paginacja)

*Uwaga w każdym z podanych sposobów tracisz możliwość stronicowania wyników. Jeśli chcesz zachować możliwość paginacji jesteś zmuszony zapisywać sobie ziarno z którego losowałeś elementy i na tej podstawie przesuwać wyniki w prawo.


Ogólnie nie polecam sortować losowo nigdy więcej z tym problemów niż zysku biznesowego.
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.