public function setRating ($id) {
$result = mysql_query("SELECT sum(rating)
FROM `comments`
WHERE `id_parent` = '". $id ."'
");
$row = mysql_result($result, 0);
$rows = mysql_affected_rows($result);
$rating = $row / $rows;
mysql_query("UPDATE `sites`
SET `rating` = '". $rating ."'
WHERE `id` = '". $id ."'
");
}
Которая должна подсчитывать сумму в столбце rating из таблицы comments, далее она должна поделить эту сумму на кол-во посчитанных строк, и вставить получившуюся цифру в колонку rating таблицы sites.
Понимаю, что сделал чтото не так, но немогу найти причину, пол дня уже бьюсь.
Возвращает ошибку:
Warning: mysql_affected_rows(): supplied resource is not a valid MySQL-Link resource in Z:\home\catalog.ru\www\models\main_model.[SPAN=darling]php[/SPAN] on line 71
Warning: Division by zero in Z:\home\catalog.ru\www\models\main_model.[SPAN=darling]php[/SPAN] on line 72
2012-09-19 05:12:34 MySQL error:
Data truncated for column 'rating' at row 1
Query:
UPDATE `sites`
SET `rating` = ''
WHERE `id` = '1'
Спустя 2 часа, 2 минуты, 22 секунды (19.09.2012 - 18:15) Alex_msk написал(а):
Так в чем причина, никто не подскажет чтоли? Почему данные не записываются в бд?
Спустя 1 час, 50 минут, 49 секунд (19.09.2012 - 20:06) inpost написал(а):
mysql_affected_rows - зачем её используешь? Это изменения, а не выборка.
Спустя 26 минут, 28 секунд (19.09.2012 - 20:32) Alex_msk написал(а):
В сторону чего смотреть, mysql_num_rows()?
Спустя 35 минут, 12 секунд (19.09.2012 - 21:07) Alex_msk написал(а):
Решил задачу. Вот так:
Формулу рейтинга сайта вычислял по первой появившейся в голове формуле:
сумма всех оценок / кол-во оценок.
Среднее арифметическое вообщем.
Хотелось бы тут увидеть, кто какие формулы использовал для подсчета рейтинга чего-либо в своих проектах.
public function setRating ($id) {
$result = mysqlQuery("SELECT sum(rating)
FROM `comments`
WHERE `id_parent` = '". $id ."'
");
$row = mysql_result($result, 0);
$rows = mysqlQuery("SELECT count(rating)
FROM `comments`
WHERE `id_parent` = '". $id ."'
");
$rows = mysql_result($rows, 0);
$rate = $row / $rows;
mysqlQuery("UPDATE `sites`
SET `rating` = '". round($rate, 2) ."'
WHERE `id` = '". $id ."'
");
}
Формулу рейтинга сайта вычислял по первой появившейся в голове формуле:
сумма всех оценок / кол-во оценок.
Среднее арифметическое вообщем.
Хотелось бы тут увидеть, кто какие формулы использовал для подсчета рейтинга чего-либо в своих проектах.
Спустя 2 дня, 10 часов, 56 минут, 17 секунд (22.09.2012 - 08:04) Alex_msk написал(а):
Напишу все-таки пост, если кому то интересны методы подсчета рейтинга. Поиски нормальной формулы завели меня в учебник по математике :D .
Система в моем сайте такова: есть какая либо статья, пользователь может комментировать ее с обязательной оценкой этой статьи по пятибалльной системе.
Т.е. один коммент = одна оценка. На основе этих комментариев подсчитывается рейтинг статьи. Изначально я просто подсчитывал среднее арифметическое, т.е. сумму баллов к статье делил на общее кол-во оценок этой статьи. Но у этой формулы большой недостаток, не подсчитывался "вес" оценки. Т.е. статья с одной оценкой, скажем 5 баллов, сразу же вылезала в топ, ибо 5/1=5.
Наткнулся на такую штуку:
Zx=Yx * (X / 100) при x < 100.
Z=Z1+Z2+Z3....+Zn
при x>100
Zx=Yx.
X - Порядковый номер оценки
Yx - Оценка по счету X
Zx - Рейтинг, начисляемый за данную оценку
В данной формуле каждая следующая оценка имеет больший "вес", чем предыдущая.
Ну и, собственно, реализация. Имеется таблица comments:
Ну и сам метод обновления рейтинга:
Система в моем сайте такова: есть какая либо статья, пользователь может комментировать ее с обязательной оценкой этой статьи по пятибалльной системе.
Т.е. один коммент = одна оценка. На основе этих комментариев подсчитывается рейтинг статьи. Изначально я просто подсчитывал среднее арифметическое, т.е. сумму баллов к статье делил на общее кол-во оценок этой статьи. Но у этой формулы большой недостаток, не подсчитывался "вес" оценки. Т.е. статья с одной оценкой, скажем 5 баллов, сразу же вылезала в топ, ибо 5/1=5.
Наткнулся на такую штуку:
Zx=Yx * (X / 100) при x < 100.
Z=Z1+Z2+Z3....+Zn
при x>100
Zx=Yx.
X - Порядковый номер оценки
Yx - Оценка по счету X
Zx - Рейтинг, начисляемый за данную оценку
В данной формуле каждая следующая оценка имеет больший "вес", чем предыдущая.
Ну и, собственно, реализация. Имеется таблица comments:
id | id_parent | rating | date | text | email | name
Ну и сам метод обновления рейтинга:
//Метод подсчета рейтинга сайта
public function setRating ($id) {
$res = mysqlQuery("SELECT *
FROM `comments`
WHERE `id_parent` = '". $id ."'
");
while($row = mysql_fetch_assoc($res)) {
$x[] = $row['rating'];
}
$n = 100;
if(count($x) < $n) {
$n = $x;
$keys = array_keys($n);
for($i = 1; $i<count($n); $i++) {
$z[$i] = $n[$i] * ($keys[$i] / 100);
}
$rate = array_sum($z);
} else {
for($i = 0; $i < count($x); $i++) {
$z[$i] = $x[$i];
}
$rate = array_sum($z);
}
mysqlQuery("UPDATE `sites`
SET
`rating` = '". $rate ."'
WHERE `id` = '". $id."'
");
}
Спустя 5 часов, 12 минут, 11 секунд (22.09.2012 - 13:16) neadekvat написал(а):
1. Про рейтинг. Взял за основу рейтинг, использовавшийся примерно год назад на world-art.ru (может, и сейчас используется).
2. Метод обновления рейтинга - это каша какая-то, написано ужасно. Используй больше MySQL функций, если есть такая необходимость, и больше встроенных php, не надо писать все вручную.
/**
* Вычисление расчетного рейтинга
*
* Байесова оценка
* w - конечный рейтинг
* r - средний рейтинг объекта
* v - количество проголосовавших за объект
* c - постоянная величина, средний рейтинг всех объектов
* m - минимальное количество голосов для участия в рейтинге
*
*
* @param float средний рейтинг
* @param int количество проголовавших
*/
function calc_rating($r, $v)
{
$c = 7.0726;
$m = 10;
if ($m > $v)
return false;
$w = ($r * $v + $c * $m) / ($v + $m);
return sprintf('%.4f', $w);
}
2. Метод обновления рейтинга - это каша какая-то, написано ужасно. Используй больше MySQL функций, если есть такая необходимость, и больше встроенных php, не надо писать все вручную.
Спустя 21 минута, 39 секунд (22.09.2012 - 13:37) Alex_msk написал(а):
Цитата |
2. Метод обновления рейтинга - это каша какая-то, написано ужасно. Используй больше MySQL функций, если есть такая необходимость, и больше встроенных php, не надо писать все вручную. |
Немного непонял.. (
И как мою каше можно модифицировать? Не могли бы пояснить?
Спустя 11 минут, 10 секунд (22.09.2012 - 13:49) neadekvat написал(а):
Цитата (Alex_msk @ 22.09.2012 - 14:37) |
И как мою каше можно модифицировать? Не могли бы пояснить? |
Я бы рад, но там реально каша - я не понимаю, что происходит. Однобуквенные переменные, непонятные действия и пр. Прокомментируй действия, попробую помочь упросить.
Спустя 1 час, 3 минуты, 21 секунда (22.09.2012 - 14:52) Alex_msk написал(а):
<?php
public function setRating ($id) {
//Выбираем из таблицы все оценки соответствующие статье
$res = mysqlQuery("SELECT *
FROM `comments`
WHERE `id_parent` = '". $id ."'
");
//Записываем в массив X все оценки данной статьи
while($row = mysql_fetch_assoc($res)) {
$x[] = $row['rating'];
}
//N - произвольное число, после которого "вес" оценки значительно вырастает
$n = 100;
//Если количество оценок меньше N, то применяем формулу
//Zx=Yx * (X / 100)
//Z=Z1+Z2+Z3....+Zn
if(count($x) < $n) {
//Кладем в массив $keys значения всех ключей(самих оценок) из
//массива $x
$keys = array_keys($x);
for($i = 0; $i<count($x); $i++) {
//Вычисляем рейтинг за оценку
$z[$i] = $x[$i] * ($keys[$i] / 100);
}
//Складываем значения рейтингов всех оценок и получаем рейтинг
// статьи
$rate = array_sum($z);
} else {
//Если количество оценок больше чем N, то применяем формулу Zx = Yx
for($i = 0; $i < count($x); $i++) {
//Вычисляем рейтинг за оценку
$z[$i] = $x[$i];
}
//Опять же суммируем рейтинг каждой оценки и получаем рейтинг
//статьи
$rate = array_sum($z);
}
//Записываем рейтинг в БД
mysqlQuery("UPDATE `sites`
SET
`rating` = '". $rate ."'
WHERE `id` = '". $id."'
");
}
Спустя 4 минуты, 4 секунды (22.09.2012 - 14:56) neadekvat написал(а):
Alex_msk, ликбез: свой код обрамляешь тэгами [ php ], а сам код начинаешь c <?php, тогда будет адекватная подсветка синтаксиса.