Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php][mysql] losowy wybor rekordów
Forum PHP.pl > Forum > Przedszkole
Raffuss
Witam,

Jestem w trakcie pisania lerningowego ze tak powiem skryptu i utknałem. Skrypt wykonuje troche instrukcji warunkowych, po czym natrafiajac na jedna z nich includuje plik którego zadaniem jest wyjąć z bazy usersp (id, username, pkt) losowo 4 userow, bez wzgledu czy po ID w bazie, czy po ich loginach, po czym ma im w zależności od wylosowanego miejsca przypisać odpowiednio 4,3,2,1 pkt, zapisujac wyniki (tj ktory nick otrzymal ile pkt) do bazy pointsl (id, name, username, pkt), a takze uzupełnia obecne karty danego usera. Tak to po krótce wygląda..

Lwią część mam już napisaną, tj update bazy usersp oraz dopisanie nowych rekordów w pointsl.

Mój problem polega na tym iż nie wiem jak wyciągnąć losowo z bazy 4 nie powtarzajace sie loginy i przypisac je do 4 roznych zmiennych. Poszperalem jednak troszke w manualu (na forum nie znalazlo ani jednego wyniku), znalazlem funkcje rand() w mysql by wyjac losowe pozycje z tabeli i wyszło mi coś takiego:
  1. <?php
  2. $wynik = mysql_query ("SELECT id FROM usersp ORDER BY rand () LIMIT 4;");
  3. while ($wynik && $rekord = mysql_fetch_assoc ($wynik)) {
  4. $i=0;
  5. echo "nr".$i++." nalezy do ".$rekord['id']."\n";
  6. }
  7. ?>

Fajnie ale nie działa, a tzn ze cos zle wpisalem.. Tj zupełnie niczego nie zwraca.. Myślałem jeszcze nad array_rand() z początku, tylko tam już zupełnie nie wiem jak nią wyciągnąć cokolwiek z bazy. Patrzę na manuala i zamiast coraz więcej rozumieć, głupieję..
wookieb
Wywal średnik z zapytania.
Raffuss
Moje przeoczenie, ";" wywalony.. nie działa nadal niestety..
wookieb
zrób
Kod
echo mysql_error();

jezeli nic nie bedzie to sprawdz jakie sa rekordy w bazie
No i sprawdz czy masz polaczenie z baza.
Raffuss
Do czego to brak snu prowadzi jednak..

Polecenie wrzucilem, wyplulo bleda, a jak..
  1. <?php
  2. Table 'mysql.proc' doesnt exist
  3. ?>


Tylko z tego co wiem trzeba przepuscic w tym wypadku polecenie:
  1. <?php
  2. mysql_fix_privilege_tables
  3. ?>

ale z poziomu shella, a do tego na tym serwerze nie mam dostepu. 
Trzeba dac cynka adminom znaczy..?
wookieb
A nie wiem czy czasem w phpmyadminie tego nie zrobisz. Może tabela jest zepsuta więc ją napraw.
Raffuss
Ok, admini już sobie naprawiają..

Teraz powróćmy jednak do tematu głównego.. czy tak sformuowane zapytanie, może zwrócić powtarzający się wynik, np powtorzy dwa takie same ID? A jesli tak to jak temu zapobiec..? Manual twierdzi ze jest to losowy wybor, ale nie ma tam slowa o powtarzalnosci wybranych rekordow, oraz jak do każdego z 4 rekordów przypisać unikalną zmienną, tak by można było je następnie dopisać do bazy
  1. UPDATE usersp SET pkt='1' WHERE id='$nazwa_zmiennej_wylosowanego_numeru'
 
wookieb
  1. SELECT DISTINCT pole FROM tabela ORDER BY rand() LIMIT 4

Zwróci ci unikalne rekordy.
Raffuss
Dziekuje bardzo za pomoc.. smile.gif juz mam wszystko jak trzeba smile.gif
szopen
stosowanie order by rand() przy dużych bazach i małej ilości rekordów do pobrania nie jest zbyt wydajnym rozwiązaniem. Może zrób tak jak opisałem tu: http://forum.php.pl/index.php?showtopic=10...mp;#entry511229 . Trzeba jedynie dodać sprawdzanie, czy dany ID nie został wcześniej wylosowany. Innymi słowy -- dodać primary key w tabelce numbers winksmiley.jpg
Dzięki temu możesz zmienić zapytanie kilku(nasto)sekundowe na działające poniżej sekundy.

--- edit
Proszę: http://forum.php.pl/index.php?s=&showt...st&p=511264
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.