Bạn có thể thực hiện việc này bằng cách sử dụng rand()
và sau đó sử dụng tổng tích lũy. Giả sử chúng cộng lại đến 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;
Ghi chú:
-
rand()
được gọi một lần trong một truy vấn con để khởi tạo một biến. Nhiều cuộc gọi đếnrand()
không mong muốn. - Có một cơ hội từ xa là số ngẫu nhiên sẽ nằm chính xác trên ranh giới giữa hai giá trị.
limit 1
tùy ý chọn 1. - Điều này có thể được thực hiện hiệu quả hơn bằng cách dừng truy vấn con khi
cumep > @r
. - Các giá trị không nhất thiết phải theo bất kỳ thứ tự cụ thể nào.
- Điều này có thể được sửa đổi để xử lý các trường hợp tổng không bằng 1, nhưng đó sẽ là một câu hỏi khác.