[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Проблема с подсчетом кол-ва столбцов
Alex_msk
Есть такая функция

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:

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 (может, и сейчас используется).
/**
* Вычисление расчетного рейтинга
*
* Байесова оценка
* 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, тогда будет адекватная подсветка синтаксиса.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.