Система рейтинга MySQL - найти рейтинг

Я пытаюсь оценить «Типы фруктов» по ​​максимально возможной оценке пользователей.

У меня есть таблица Fruit под названием Ratings только для представления оценок со следующей информацией

Fruit_id int
From_ID int
Rating int

теперь я пытаюсь запустить команду SQL, подобную следующей

select From_ID, AVG(Rating) AS Rating FROM Ratings Group BY `Fruit_ID` ORDER by Rating DESC

Это работает, однако, если я получаю 1 пользователя, который оценивает фрукт и яблоко на 5, а затем 1000 пользователей, которые оценивают апельсин на 4, яблоко внезапно считается лучше.

Как я могу принять во внимание количество голосов, чтобы гарантировать, что большинство голосов вместе с лучшими будут первыми.


person Mike Silvis    schedule 23.06.2010    source источник


Ответы (2)


Почему бы просто не выбрать количество голосов и не отобразить их пользователю. Так что да, 1 голос из 5 за яблоко будет общим 5, НО только с 1 голосом. Это дало бы пользователям простой способ увидеть, насколько «популярен» данный рейтинг.

Именно так сегодня работает большинство пятизвездочных рейтинговых систем в сети, если я не ошибаюсь.

Удачи!

Ник

person direct    schedule 23.06.2010
comment
Проблема здесь не в отображении данных, а в попытке ранжировать лучшие фрукты над единицей одним голосом. - person pws5068; 23.06.2010

Этот вопрос больше касается настройки вашей математической формулы, чем чего-либо еще.

Похоже, вы просите популярности, а не рейтинга. Простым способом сделать это может быть умножение среднего рейтинга на количество голосов. Как насчет этого (пожалуйста, извините меня, если мой синтаксис отключен, я сейчас не на SQL-сервере):

select From_ID, AVG(Rating) * COUNT(Rating) AS Rating FROM Ratings Group BYФрукт_IDORDER by Rating DESC

Имейте в виду, что эта формула оценивает 1000 голосов из 1 намного выше, чем 1 голос из 5.

person rlb.usa    schedule 23.06.2010
comment
Вы можете просто использовать... SELECT From_ID, SUM(Rating) AS Rating FROM Ratings GROUP BY Fruit IDORDER by Rating DESC ... as AVERAGE * COUNT = SUM. - person Brian Hooper; 23.06.2010