Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [MySQL][PHP] order by rand() a stronicowanie
thomson89
post
Post #1





Grupa: Zarejestrowani
Postów: 1 178
Pomógł: 51
Dołączył: 7.01.2009
Skąd: Gdańsk

Ostrzeżenie: (0%)
-----


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!
Go to the top of the page
+Quote Post
marcio
post
Post #2





Grupa: Zarejestrowani
Postów: 2 291
Pomógł: 156
Dołączył: 23.09.2007
Skąd: ITALY-MILAN

Ostrzeżenie: (10%)
X----


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()

Go to the top of the page
+Quote Post
thomson89
post
Post #3





Grupa: Zarejestrowani
Postów: 1 178
Pomógł: 51
Dołączył: 7.01.2009
Skąd: Gdańsk

Ostrzeżenie: (0%)
-----


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ę?
Go to the top of the page
+Quote Post
marcio
post
Post #4





Grupa: Zarejestrowani
Postów: 2 291
Pomógł: 156
Dołączył: 23.09.2007
Skąd: ITALY-MILAN

Ostrzeżenie: (10%)
X----


po pierwsze order i limit sa na koncu a nie in().




zaraz ci odp bo usypiam braciszka.

Go to the top of the page
+Quote Post
thomson89
post
Post #5





Grupa: Zarejestrowani
Postów: 1 178
Pomógł: 51
Dołączył: 7.01.2009
Skąd: Gdańsk

Ostrzeżenie: (0%)
-----


Też usypiałem braciszka jak był mały (IMG:style_emoticons/default/winksmiley.jpg)

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



Ten post edytował thomson89 8.11.2009, 19:31:12
Go to the top of the page
+Quote Post
marcio
post
Post #6





Grupa: Zarejestrowani
Postów: 2 291
Pomógł: 156
Dołączył: 23.09.2007
Skąd: ITALY-MILAN

Ostrzeżenie: (10%)
X----


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.

Ten post edytował marcio 8.11.2009, 19:29:41
Go to the top of the page
+Quote Post
thomson89
post
Post #7





Grupa: Zarejestrowani
Postów: 1 178
Pomógł: 51
Dołączył: 7.01.2009
Skąd: Gdańsk

Ostrzeżenie: (0%)
-----


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


Ten post edytował thomson89 8.11.2009, 21:18:50
Go to the top of the page
+Quote Post
marcio
post
Post #8





Grupa: Zarejestrowani
Postów: 2 291
Pomógł: 156
Dołączył: 23.09.2007
Skąd: ITALY-MILAN

Ostrzeżenie: (10%)
X----


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

Go to the top of the page
+Quote Post
thomson89
post
Post #9





Grupa: Zarejestrowani
Postów: 1 178
Pomógł: 51
Dołączył: 7.01.2009
Skąd: Gdańsk

Ostrzeżenie: (0%)
-----


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. //...


Ten post edytował thomson89 9.11.2009, 08:06:37
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 17.09.2025 - 21:55