Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [php][mysql] losowy wybor rekordów
Raffuss
post 29.08.2008, 05:18:27
Post #1





Grupa: Zarejestrowani
Postów: 54
Pomógł: 0
Dołączył: 26.07.2008

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


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


--------------------
zaburzony.pl
Go to the top of the page
+Quote Post
wookieb
post 29.08.2008, 06:04:53
Post #2





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




Wywal średnik z zapytania.


--------------------
Go to the top of the page
+Quote Post
Raffuss
post 29.08.2008, 06:18:29
Post #3





Grupa: Zarejestrowani
Postów: 54
Pomógł: 0
Dołączył: 26.07.2008

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


Moje przeoczenie, ";" wywalony.. nie działa nadal niestety..


--------------------
zaburzony.pl
Go to the top of the page
+Quote Post
wookieb
post 29.08.2008, 06:22:37
Post #4





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




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.

Ten post edytował wookieb 29.08.2008, 06:23:05


--------------------
Go to the top of the page
+Quote Post
Raffuss
post 29.08.2008, 06:51:39
Post #5





Grupa: Zarejestrowani
Postów: 54
Pomógł: 0
Dołączył: 26.07.2008

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


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


--------------------
zaburzony.pl
Go to the top of the page
+Quote Post
wookieb
post 29.08.2008, 07:12:47
Post #6





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




A nie wiem czy czasem w phpmyadminie tego nie zrobisz. Może tabela jest zepsuta więc ją napraw.


--------------------
Go to the top of the page
+Quote Post
Raffuss
post 29.08.2008, 09:17:59
Post #7





Grupa: Zarejestrowani
Postów: 54
Pomógł: 0
Dołączył: 26.07.2008

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


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'
 


--------------------
zaburzony.pl
Go to the top of the page
+Quote Post
wookieb
post 29.08.2008, 09:52:16
Post #8





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




  1. SELECT DISTINCT pole FROM tabela ORDER BY rand() LIMIT 4

Zwróci ci unikalne rekordy.


--------------------
Go to the top of the page
+Quote Post
Raffuss
post 31.08.2008, 06:29:47
Post #9





Grupa: Zarejestrowani
Postów: 54
Pomógł: 0
Dołączył: 26.07.2008

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


Dziekuje bardzo za pomoc.. smile.gif juz mam wszystko jak trzeba smile.gif


--------------------
zaburzony.pl
Go to the top of the page
+Quote Post
szopen
post 31.08.2008, 13:05:21
Post #10





Grupa: Zarejestrowani
Postów: 60
Pomógł: 5
Dołączył: 28.08.2008

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


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

Ten post edytował szopen 31.08.2008, 15:53:30
Go to the top of the page
+Quote Post

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

 



RSS Wersja Lo-Fi Aktualny czas: 2.05.2025 - 05:49