Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Голосование по пятибальной системе
 
 автор: Job   (16.12.2008 в 23:50)   письмо автору
 
 

Делаю голосование за фотографии. Не могу придумать разумный алгоритм!
Идея в следующем... фотография, под ней 5 ссылок: "1 2 3 4 5" это количество баллов которые пользователь может отдать за фотографию. Чуть выше 5 звездочек, это результаты голосования. Сколько звездочек "подсвечено" столько голосов отдали больше за фотографию.

У меня есть два решения:

1. Записывать голоса в таблицу с фотографией в отдельное текстовое поле voices следующим образом: Если поставили оценку 5 добавлять к полю voices 5. Для подсвечивания результатов голосования искать повторения в строке... каких повторений больше, столько и звездочек ставить....

2. Записывать голоса в отдельную таблицу... с id фотографии и отданным голосом... Затем sql запросами выяснить каких оценок было поставлено больше, столько звездочек и подсветить.

Какой из этих двух вариантов разумнее? Существует ли какой - то третий вариант?
И сразу возникает вопрос, как сравнить переменные и определить из них большую по значению?

Буду искренне благодарен за помощь :)

  Ответить  
 
 автор: Trianon   (17.12.2008 в 00:09)   письмо автору
 
   для: Job   (16.12.2008 в 23:50)
 

Нужно учитывать, что голос это свойство не только фотографии, но и автора оценки.
Впрочем, если отдельные голоса не хранить, можно пойти и по первому пути.
Тут нужно оценить насколько велико будет множество фотографий, посетителей и отдельных голосов.
Если не пугает - лучше выбрать второй вариант.

>И сразу возникает вопрос, как сравнить переменные и определить из них большую по значению?
А как вы делаете это без компьютера?

  Ответить  
 
 автор: BinLaden   (17.12.2008 в 00:10)   письмо автору
 
   для: Job   (16.12.2008 в 23:50)
 

> каких повторений больше, столько и звездочек ставить
> выяснить каких оценок было поставлено больше, столько звездочек и подсветит

* Приходит в гнев * При оценках "1, 1, 2, 3, 5" Вы что поставите в итоге? 1?

  Ответить  
 
 автор: valenok   (17.12.2008 в 03:12)   письмо автору
 
   для: BinLaden   (17.12.2008 в 00:10)
 

В таких случаях используется медиана, но для ее расчёта придётся хранить также список всех голосов.

  Ответить  
 
 автор: BinLaden   (17.12.2008 в 03:45)   письмо автору
 
   для: valenok   (17.12.2008 в 03:12)
 

Ноу комментс

  Ответить  
 
 автор: lifead   (17.12.2008 в 10:06)   письмо автору
 
   для: BinLaden   (17.12.2008 в 03:45)
 

а среднее арифметическое чем вас не устраивает? зачем так все сложно делать, есть целая наука - мат статистика, она (наука) уже все уже решила.
В базе можно вообще хранить только 2 значения, средне арифметическое значение (САЗ.) и количество проголосовавших (КП) (по умолчанию необходимо записать в них значение 0 в оба)

После того как человек ответил Вы достаете из базы САЗ (для первого равно 0) умножайте на КП (для первого равно 0) прибавляете значение которое ввел автор, к КП прибавляете 1 (единицу) и делите полученную сумму увеличенное на КП. Получаете новое САЗ, новые значения записываете в базу.
Вот так это примерно будет выглядеть на пхп

<?
//Примем:
//$srsumm-средняя оценка - САЗ (для первого значения должно быть 0)
//$sr -количество проголосовавших - КП (для первого значения должно быть 0)
//$s- оценка которую поставил автор.
$srsumm=$srsumm*$sr;
$sr++;
$srsumm=$srsumm+$s;
$srsumm=$srsumm/$sr;
//$srsumm - получаем новое среднеарифметическое
//$sr - тоже новое увеличенное на 1; 
?>


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

  Ответить  
 
 автор: HaJIuBauKa   (17.12.2008 в 10:16)   письмо автору
 
   для: lifead   (17.12.2008 в 10:06)
 

Проблемка еще в том что нужно определять голосовал ли данный человек, за данную фотку.
Да просто создай табличку и пихай туда голосования за фотки, перед запихиванием проверяй не голосовал ли уже пользователь с таким ID (если это нужно конечно), а то накрутка однако вещь неблагодарная...
примерная структура таблички:
ID | FID (ID фото) | UID (ID пользователя) | BALL (Оценка) 


для быстроты вывода статистики можно в табличку фоток добавить поля САЗ и КП как советовал lifead и обновлять их как только пользюк проголосовал

  Ответить  
 
 автор: BinLaden   (17.12.2008 в 12:46)   письмо автору
 
   для: lifead   (17.12.2008 в 10:06)
 

> lifead (17.12.2008 в 10:06)
> для: BinLaden (17.12.2008 в 03:45)
> а среднее арифметическое чем вас не устраивает?

Вы ошибились: этот вопрос нужно задавать автору темы, а не мне.

  Ответить  
 
 автор: Valick   (17.12.2008 в 12:04)   письмо автору
 
   для: BinLaden   (17.12.2008 в 03:45)
 

В фоторейтинге мне поставили низкую оценку, это как-то влияет на рейтинг?
При расчете рейтинга используется не среднее арифметическое значение, а медиана, которая не так чувствительна к отклонениям оценок (как в большую, так и в меньшую сторону). Вот пример. Для простоты позьмем оценки по одному из критериев. К примеру, фото получило следующие оценки: 8, 7, 7, 7, 7, 8, 5, 9, 7. Значение среднего арифметического = (8+7+7+7+7+8+5+9+7)/9 = 7.22. Медиана вычисляется следующим образом: расположим оценки по возрастанию от самой низкой к самой высокой и возьмем средний элемент: 5, 7, 7, 7, 7, 7, 8, 8, 9. Медиана = 7. Теперь фото получило оценку 1. Среднее арифметическое равно (8+7+7+7+7+8+5+9+7+1)/10 = 6.6. А медиана: 1, 5, 7, 7, 7, 7, 7, 8, 8, 9, она все равно осталась = 7. Если бы фото получило оценку 10, то медиана все равно осталась бы равна 7. А вот если бы фото получило несколько высоких или низких оценок, то медиана в данном случае изменилась бы скачкообразно. Таким образом медиана малочувствительна к крайним значениям оценок (в отличие от среднего арифметического) и рейтинг, вычисляемый на основе медианы также малочувствителен к выбросам как в большую, так и в меньшую сторону. Поэтому не стоит волноваться при получении одной-двух крайне низких оценок (равно как и радоваться при получении крайне высоких) - эти оценки наверняка не окажут никакого влияния на значение рейтинга в том случае, если остальные оценки лежат в другом диапазоне.

  Ответить  
 
 автор: Job   (17.12.2008 в 15:43)   письмо автору
 
   для: Valick   (17.12.2008 в 12:04)
 

Да, Медиана прикольная штука... но я всётаки остановлюсь на предложении о среднем арифметическом значении... Спасибо вам всем за помошь!!!! ))) Никогда бы недадумался наверно без вас )) Лучший форум! +1 ))

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования