2016-03-13 6 views
0

У меня есть таблица Foo(id, name, rateAvg, rateNum). rateAvg составляет от 1 до 5 и rateNum - это количество ставок по пользователям.запрос запроса mysql на два столбца с весом для каждого из них

я запрашиваю таблицу с MySQL и заказать их по самому номинальному Фоосу так:

SELECT * FROM Fooo ORDER BY rateAVG DESC, rateNum DESC 

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

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

+0

Это сложный вопрос, я боюсь, что он не подходит для переполнения стека. Все зависит от того, как вы определяете «справедливость». Вы можете использовать количество оценок в качестве веса, но влияние этого должно быть изменено для вашего индивидуального приложения. – kero

+0

Это вопрос дизайна, а не программирующий. Это действительно зависит от вас, как вы оцениваете количество рейтингов и средний рейтинг для составления списка. Самое простое решение состоит в том, чтобы умножить 2 числа друг на друга, чтобы получить оценку, и использовать эту оценку для получения ваших результатов. – Shadow

ответ

3

Вы можете попробовать применить 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 для вашего случая.