RANDOM() w MySQL na podstawie wagi - jak?

0

Mam tabelkę w postaci:

+----+-------+------------------+
| id | nazwa | liczba_wystapien |
+----+-------+------------------+
| 1 | Aaaa | 256987 |
| 2 | Bbbb | 12546 |
| 3 | Cccc | 1245 |
+----+-------+------------------+

Chcę wyciągnąć z tej tabeli losowy wiersz, ale w zależności od kolumny liczba_wystapien, tj. tak, żeby te wiersze, które mają wyższą liczbę wystąpień były zwracane częściej niż te z niższą liczbą wystąpień.

Jak to najprościej rozwiązać w MySQL?

0

SELECT * FROM tabelka ORDER BY RAND() * liczba_wystapien DESC LIMIT 1

0

To rozwiązanie działa, chociaż (moje spostrzeżenie) zwracany wynik bardzo mocno zależy od wagi - przy założeniu wybierania tylko 1 wiersza niemal zawsze zwracane są wyniki z kilkoma największymi wagami.

Potrzebuję też, żeby losowanie pojedynczego wiersza było bardzo szybkie. Mam do wypełnienia 600k wierszy losowymi (wg wagi) wartościami; wymagany czas losowania z tabeli 20k to kilka ms - w tej chwili mam ~80ms. Zależy mi na czymś co nie korzystałoby z sortowania.

Wiem, że jest gdzieś propozycja z posumowaniem wszystkich wag i później wylosowania wartości od 0 do tej sumy i odejmowaniu po kolei wag od tej wylosowanej wartości do momentu, aż po odjęciu otrzymam wartość mniejszą od 0. Czy ktoś stosował coś podobnego?

Jak będę mieć jakiś gotowy kawałek kodu to wkleję też.

0
fifjak napisał(a):

Wiem, że jest gdzieś propozycja z posumowaniem wszystkich wag i później wylosowania wartości od 0 do tej sumy i odejmowaniu po kolei wag od tej wylosowanej wartości do momentu, aż po odjęciu otrzymam wartość mniejszą od 0

w takim przypadku i tak musiałbyś posortować najpierw dane według wagi, ale będziesz mógł dodać do tego indeks więc powinno być dużo szybciej - wyniki jednak będą prawdopodobnie identyczne z poprzednią metodą

1 użytkowników online, w tym zalogowanych: 0, gości: 1