Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP][MYSQL]Zwiększenie szansy na wylosowanie danego rekordu
smietek
post
Post #1





Grupa: Zarejestrowani
Postów: 306
Pomógł: 32
Dołączył: 20.01.2008

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


Mam zamiar napisać system, w którym ludzie dodają jakieś tam teksty czy linki, które następnie są wyświetlane na odpowiedniej stronie.
Powiedzmy, że za wyświetlenie linku/tekstu ten rekord dostaje punkt.
I teraz, chciałbym zrobić tak, że każdy tekst ma szansę na pojawienie się na pierwszej stronie (poprzez losowanie), ale także jednocześnie im większa liczba punktów, tym większa szansa na wyświetlenie.

Powiedzmy, że mam taką tabelkę:
|ID|Zawartość|Punkty|
|1 |Coś tam | 100 |
itd...

Czy jest to możliwe z poziomu zapytania (np. z pomocą RAND()), czy muszę pobrać wszystkie rekordy i odpowiednio wybrać z poziomu PHP?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 3)
athei
post
Post #2





Grupa: Zarejestrowani
Postów: 389
Pomógł: 141
Dołączył: 11.04.2009

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


Możesz zrobić wybór i losowanie w zapytaniu mysql np.
  1. SELECT * FROM `tabela` WHERE `punkty` > 90 ORDER BY Rand() LIMIT 2

Wylosuje 2 rekordy które mają więcej niż 90 punktów.
Metoda ta jest wolna, więcej http://akinas.com/pages/en/blog/mysql_random_row/

Ten post edytował athei 28.07.2009, 09:57:06
Go to the top of the page
+Quote Post
smietek
post
Post #3





Grupa: Zarejestrowani
Postów: 306
Pomógł: 32
Dołączył: 20.01.2008

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


Mi bardziej chodzi o coś takiego:
Jeśli pkt. = 2 to tak jakbym miał dwa rekordy o tym ID.
Go to the top of the page
+Quote Post
michaJlS
post
Post #4





Grupa: Zarejestrowani
Postów: 83
Pomógł: 9
Dołączył: 21.05.2004
Skąd: Glogau/Breslau

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


Cytat(athei @ 28.07.2009, 10:54:43 ) *
Możesz zrobić wybór i losowanie w zapytaniu mysql np.
  1. SELECT * FROM `tabela` WHERE `punkty` > 90 ORDER BY Rand() LIMIT 2

Wylosuje 2 rekordy które mają więcej niż 90 punktów.
Metoda ta jest wolna, więcej http://akinas.com/pages/en/blog/mysql_random_row/



Albo
  1. SELECT * FROM `tabela` WHERE `punkty` > Rand(N) ORDER BY Rand() LIMIT 1


Gdzie N to górne ograniczenie na maksymalną liczbę punktów (albo i bez ograniczenia). Wtedy wpisy z mniejszą liczbą punktów będą się pojawiały rzadziej.

Możesz też @smietek właśnie przerobić bazę i dodawać po pare tych samych rekordów, w zależności od liczby punktów (chociaż to troche głupie przy dużej liczbie punktów).

Można też inaczej. Dodajesz dwa pola `a0` i `a1` do swojej tabeli. Przy dodawaniu nowego wpisu będziesz wybierał maksymalną wartość po wszystkich `a1` i zapisywał jako `a0` nowego wpisu. Jako `a1` zapiszesz nowe `a0`+liczba punktów.
Potem przy wybieraniu losujesz liczbę mniejszą niż MAX(a1) i szukasz wpisu, w którego przedział [a0,a1] się wstrzeliłeś. Jeśli nie ma takiego wpisu (bo np został usunięty) - to losujesz jeszcze raz.
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: 23.08.2025 - 06:48