Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][MYSQL]Zwiększenie szansy na wylosowanie danego rekordu
Forum PHP.pl > Forum > Przedszkole
smietek
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?
athei
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/
smietek
Mi bardziej chodzi o coś takiego:
Jeśli pkt. = 2 to tak jakbym miał dwa rekordy o tym ID.
michaJlS
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.
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.