Выборка из базы с % вероятностью

D
На сайте с 20.09.2010
Offline
175
484

В таблице есть 2 поля: имя баннера(TEXT) и вероятность(INT):

name | perc

1.jpg | 20

2.jpg | 50

3.jpg | 30

Как выбирать данные соотвественно вероятностям(процентам). Тоесть, ттобы из 10 запросов к таблице чтобы 2 раза выбрало 1.jpg, 5 раз 2.jpg и 3 раза 3.jpg

Подозреваю что такого оператора нет.. Помогите придумать алгоритм

Оптимизайка
На сайте с 11.03.2012
Offline
396
#1
⭐ BotGuard (https://botguard.net) ⭐ — защита вашего сайта от вредоносных ботов, воровства контента, клонирования, спама и хакерских атак!
D
На сайте с 20.09.2010
Offline
175
#2

там пример для PostgreSQL, а для Mysql этот синтаксис подойдет?

T2
На сайте с 24.02.2008
Offline
151
#3

если данные о процентах статические то можно сделать проще

name |

1.jpg

1.jpg

2.jpg

2.jpg

2.jpg

2.jpg

2.jpg

3.jpg

3.jpg

3.jpg

и брать простым рандомом

Партнёрка VPN, выплаты 16% - https://c.vpn.how/?p=5442
L
На сайте с 10.02.2015
Offline
257
#4

В mysql нету "WITH"

Каждый раз выбирать рендомом - большая нагрузка на базу, если она большая.

Что можно сделать:

а) выбирать допустим 10 случайных и кешировать их на час, а на приложении уже выбирать их согласно весов.

б) завести дополнительное поле "Накопительный вес".

Потом:

1) зная суммарный вес WeightSum,

2) генерируем случайное число $WeightRand = rand(0, Sum)

3) выбираем из базы запись с условием WHERE Weight > $WeightRand ORDER BY Weight ASC LIMIT 1

Минусы: при деактивации баннера нужно обновлять накопительные веса всем баннерам после него.

PA
На сайте с 12.02.2016
Offline
24
#5
livetv:

б) завести дополнительное поле "Накопительный вес".
Потом:
1) зная суммарный вес WeightSum,
2) генерируем случайное число $WeightRand = rand(0, Sum)
3) выбираем из базы запись с условием WHERE Weight > $WeightRand ORDER BY Weight ASC LIMIT 1
Минусы: при деактивации баннера нужно обновлять накопительные веса всем баннерам после него.

заинтересовало... ктати, выборку можно сделать на чистом sql, без пхп и т.д.

исходную табличку дополнил полем WeightSum:

name	| perc	| WeightSum
------------------------------------------------------
1.jpg | 20 | 0
2.jpg | 50 | 20
3.jpg | 30 | 70

SELECT *
FROM `img_rand`
where WeightSum <= rand()*100
order by WeightSum DESC
limit 1

вроде работает :)

. . .
AP
На сайте с 12.06.2015
Offline
74
#6
ps axf:
заинтересовало... ктати, выборку можно сделать на чистом sql, без пхп и т.д.

исходную табличку дополнил полем WeightSum:
name	| perc	| WeightSum

------------------------------------------------------
1.jpg | 20 | 0
2.jpg | 50 | 20
3.jpg | 30 | 70


SELECT *

FROM `img_rand`
where WeightSum <= rand()*100
order by WeightSum DESC
limit 1


вроде работает :)

Возьму на заметку, интересное решение :)

AP
На сайте с 12.06.2015
Offline
74
#7
A007MP:
Возьму на заметку, интересное решение :)

Работает, да не совсем правильно. Результаты выдает инверсно, то есть с точностью до наоборот. Значение, у которого 80% выборки, выпадает только в 20% случаев.

И при этом, если случайное число будет меньше, чем минимальный процент, то результата не будет вообще.

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий