У меня есть стол 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 должен иметь вес для заказа, как это можно применить в моем запросе
Вы можете попробовать применить 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
для вашего случая.
Других решений пока нет …