Anda dapat melakukan ini dengan menggunakan rand() dan kemudian menggunakan jumlah kumulatif. Dengan asumsi mereka menambahkan hingga 100%:
select t.*
from (select t.*, (@cumep := @cumep + chance) as cumep
from t cross join
(select @cumep := 0, @r := rand()) params
) t
where @r between cumep - chance and cumep
limit 1;
Catatan:
rand()dipanggil sekali dalam subquery untuk menginisialisasi variabel. Beberapa panggilan kerand()tidak diinginkan.- Ada kemungkinan kecil bahwa bilangan acak akan tepat berada pada batas antara dua nilai.
limit 1sewenang-wenang memilih 1. - Ini dapat dibuat lebih efisien dengan menghentikan subquery ketika
cumep > @r. - Nilai tidak harus dalam urutan tertentu.
- Ini dapat dimodifikasi untuk menangani peluang di mana jumlahnya tidak sama dengan 1, tetapi itu akan menjadi pertanyaan lain.