Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP] order by rand() a stronicowanie
Forum PHP.pl > Forum > Przedszkole
thomson89
Witam!

Posiadam taki prosty skrypt ze stronicowaniem za pomocą LIMIT. Chciałem zrobić sortowanie losowe wszystkich rekordów z bazy i takie ich wyświetlenie. W tym zadaniu świetnie sprawia się ORDER by RAND(). Niestety, czasami niektóre rekordy się powtarzają i chciałbym to wyeliminować. Pytanie tylko jak to zrobić?

Pozdrawiam, Mateusz!
marcio
Przyszly mi do glowy 2 sposoby:

1)Zapisujesz wylosowane zapytania do sesji i potem w sql dodajesz NOT IN()

2)Zapisujesz dane to tablicy po czym losujesz je z poziomu php za pomoca array_rand()/rand()/mt_rand()

thomson89
No to interesuj mnie pierwsza możliwość bo drugiej jakoś sobie nie wyobrażam.

Czyli muszę sobie do sesji zapisać tablicę, powiedzmy wielowymiarową. Na stronie każdej stronie najpierw sprawdzić czy istnieje $tabliczka[$page], po wykonaniu zapytania z pobraniem rekordów, zapisać id rekordów do tablicy $tabliczka[$page] .= $id;.

Na następnej stronie, muszę zbudować zapytanie:
  1. SELECT * FROM `wyroby` ORDER BY RAND() LIMIT 10, 10 NOT IN(1, 12, 123, 145);


Dobrze rozumuję?
marcio
po pierwsze order i limit sa na koncu a nie in().




zaraz ci odp bo usypiam braciszka.

thomson89
Też usypiałem braciszka jak był mały winksmiley.jpg

  1. SELECT * FROM `wyroby` NOT IN(1, 12, 123, 145) ORDER BY RAND() LIMIT 10, 10;

marcio
Powiedzmy ze robisz zapytanie:

  1.  
  2. if(!isset($_SESSION['id_rand']))
  3.  
  4. $query = "SELECT * FROM `wyroby` ORDER BY RAND() LIMIT 10, 10";
  5.  
  6. else $query = "SELECT * FROM `wyroby` where TABELA NOT IN('".implode(',', $_SESSION['id_rand'])."') ORDER BY RAND() LIMIT 10, 10";
  7.  
  8.  
  9.  
  10.  


POtem dane wyciagniete przez zapytanie zapisuj do sesji oczywiscie do jakies zmiennej zapisz wszystkie dane za pomoca while($dane = mysql_fetch_assoc()):

Kod
$_SESSION['id_rand'][] = $dane_z_sql


Taki ogolny zarys bo teraz nie mam czasu.
thomson89
Ok, dzięki!

POPRAWKA: Zabrałem się do roboty:
  1. $siema = array();
  2. $i = 1;
  3. while($i <= 150){
  4. $siema .= ', '.$i;
  5. $i++;
  6. }
  7. $_SESSION['id_rand'] = $siema;


Dałem tak, żeby sprawdzić czy działa... I dalej:

  1. //pobieranie id, żeby nie powtarzać
  2. if(!isset($_SESSION['id_rand']))
  3. $query1 = 'SELECT * FROM `wyroby` ORDER BY RAND() LIMIT '.$start.', '.$perPage;
  4. else
  5. $query1 = 'SELECT * FROM `wyroby` WHERE `id` NOT IN('.$_SESSION['id_rand'].') ORDER BY RAND() LIMIT '.$start.', '.$perPage;


Ale niestety nie działa, wywala:
Kod
Warning: mysql_fetch_assoc() expects parameter 1 to be resource, boolean given in C:\WEB\mamusia\tresc\bizuteria\galeria_wszystkie.php on line 70
marcio
Podaj wiecej kodu i pogrub linie nr. 70.

Blad wedlug mnie jest spowodowany tym ze w:

  1. NOT IN('.$_SESSION['id_rand'].')


Masz czysty string zrob tak jak ja ci mowilem zamiast twojego kodu daj ten:

  1.  
  2. $siema = array();
  3. $i = 1;
  4. while($i <= 150){
  5. $_SESSION['id_rand'][] = $i;
  6. $i++;
  7. } 
  8.  
  9.  


A w zapytanie zamien NOT IN na ten:

  1.  
  2. NOT IN('.implode(',', $_SESSION['id_rand']).')
  3.  


Powinno dzialac

thomson89
Nic nie wywala, ale wyników też nie wyświetla. Powiem że jest ich ok. 500, więc 150 nie powinno robić problemu.

Linia 70:
  1. while($record = mysql_fetch_assoc($result)) {
  2. //...
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.