MySQL запрос порядка по два столбца с весом для каждого из них

У меня есть стол Foo(id, name, rateAvg, rateNum), rateAvg составляет от 1 до 5 и rateNum количество оценок пользователей.

Я запрашиваю таблицу с mysql и заказываю их по большинству рейтинговых Foos следующим образом:

SELECT * FROM Fooo ORDER BY rateAVG DESC, rateNum DESC

но это не достаточно справедливо, например, одна строка имеет rateAvg 4.8 с 1000 ставками, а другая — с rateAvg 5 и 10, и по моему пункту запроса два идут первыми.

Редактировать:
из комментария @kingkero я узнал, что каждый из rateAvg и rateNum должен иметь вес для заказа, как это можно применить в моем запросе

0

Решение

Вы можете попробовать применить bayesian average, но вы должны предварительно рассчитать этот рейтинг и сохранить в одном из ваших полей.

b(r) = [ W(a) * a + W(r) * r ] / (W(a) + W(r)]

r = average rating for an item
W(r) = weight of that rating, which is the number of ratings
a = average rating for your collection
W(a) = weight of that average, which is an arbitrary number,
but should be higher if you generally expect to have more ratings
for your items; 100 is used here, for a database which expects
many ratings per item
b(r) = new bayesian rating

Например, в вашем случае:

a = (4.8 * 1000 + 5 * 10) / 1010 = 4.8019
r1 = 4.8
r2 = 5
W(a) = 100 // arbitrary average weight
W(r1) = 1000 // weight of first raiting
W(r2) = 10 // weight of second rating

b(r1) = (100 * 4.8019 + 1000 * 4.8) / (100 + 1000) = 4.8001
b(r2) = (100 * 4.8019 + 10 * 5) / (100 + 10) = 4.8199

Таким образом, вы можете видеть, что эти значения близки друг к другу, и вы можете попытаться изменить средний вес, чтобы настроить это bayesian average rating для вашего случая.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]