Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Рейтинг файлу 
:(
    Опции темы
gta4kv
Дата 13.3.2007, 18:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Walking around mad.
***


Профиль
Группа: Завсегдатай
Сообщений: 1868
Регистрация: 25.7.2006

Репутация: 21
Всего: 91



Вообщем помогите пожалуйста моей исохщей фантазии, как лучше реализовать данный сабж с учетом того что значение должно храниться в базе?   smile  А расчитываться все должно по среднему арифметическому. 

 smile 

Пример не нужен.. Нужно идея.. Ну а к идеи можно пример. smile

Добавлено @ 18:31 
ps.. Ещё, если у кого есть, дайте пожалуйста ссылочку где можно почитать про mod_rewrite
PM MAIL   Вверх
HalkaR
Дата 13.3.2007, 18:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пуфыстый назгул
****


Профиль
Группа: Экс. модератор
Сообщений: 2132
Регистрация: 8.12.2002
Где: В Москве

Репутация: 2
Всего: 42



1. Одна тема - один вопрос.
2. Тебе нужно хранить сумму рейтингов на текущий момент и количество рейтинговавших.
Т.е. два чила - sum и count.
Текущий рейтинг это sum/count.
При очередном рейтинге ты прибавляешь значение рейтинга к сумме и увеличиваешь count на единицу.
PM MAIL   Вверх
PARROT
Дата 13.3.2007, 18:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2339
Регистрация: 5.1.2005
Где: Спб-ЦарьГрад

Репутация: 23
Всего: 50





--------------------
Безумный утешается прошедшим, слабоумный - будущим, умный - настоящим!
PM MAIL   Вверх
gta4kv
Дата 13.3.2007, 19:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Walking around mad.
***


Профиль
Группа: Завсегдатай
Сообщений: 1868
Регистрация: 25.7.2006

Репутация: 21
Всего: 91



Цитата(HalkaR @ 13.3.2007,  18:34)
1. Одна тема - один вопрос.
2. Тебе нужно хранить сумму рейтингов на текущий момент и количество рейтинговавших.
Т.е. два чила - sum и count.
Текущий рейтинг это sum/count.
При очередном рейтинге ты прибавляешь значение рейтинга к сумме и увеличиваешь count на единицу.

Наша таблица : 
Код

|------------------|
| Table `Rate` |
|------------------|
   |--------------|
   | Field `ID` |
   |--------------|
   |-----------------|
   | Field `SUM` |
   |-----------------|
   |--------------------|
   | Field `COUNT` |
   |--------------------|
|-------------------------|
| End  Table `Rate` |
|-------------------------|

Берём инфу : 

Код

$Q1 = mysql_query ("SELECT * FROM `Rate` WHERE id=$rate_id");
$R1= mysql_fetch_assoc($Q1); ## Можно и fetch_array
$sum = $R1['SUM'];
$count = $R['COUNT'']


Как посчитать правильно эт всё?

Добавлено @ 19:38 

спасибо.
PM MAIL   Вверх
HalkaR
Дата 13.3.2007, 23:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пуфыстый назгул
****


Профиль
Группа: Экс. модератор
Сообщений: 2132
Регистрация: 8.12.2002
Где: В Москве

Репутация: 2
Всего: 42



Код

$Q1 = mysql_query ("SELECT * FROM `Rate` WHERE id=$rate_id");
$R1= mysql_fetch_assoc($Q1); ## Можно и fetch_array
$sum = $R1['SUM'];
$count = $R['COUNT']

$avg = $sum/$count;


##$rate - новый рейтинг

$sum+=$rate;
$count++;

##Теперь новый рейтинг

$avg = $sum/$count;


Это сообщение отредактировал(а) HalkaR - 13.3.2007, 23:09
PM MAIL   Вверх
gta4kv
Дата 14.3.2007, 16:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Walking around mad.
***


Профиль
Группа: Завсегдатай
Сообщений: 1868
Регистрация: 25.7.2006

Репутация: 21
Всего: 91



А еще проверка нужна, что бы пользователь ($user[login]) не мог голосовать несколько раз.. Как реализовать ?
PM MAIL   Вверх
-=Ustas=-
Дата 14.3.2007, 23:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ustix IT Group
****


Профиль
Группа: Участник Клуба
Сообщений: 2222
Регистрация: 21.1.2005
Где: Краснодар

Репутация: 32
Всего: 69



Вообще-то  лучше делать нормальный и правильный рейтинг. Я в своих проектах делаю по "формуле Байеса" - "Взвешенный рейтинг"
Код

( WR ) = ( v / ( v + m ) ) x R + ( m / ( v + m ) ) x C

Если нужен пример таблиц, как я реализовывал, а также необходимый SQL запрос, то могу завтра выложить smile

Добавлено @ 23:16 
Цитата(gta4kv @  14.3.2007,  16:48 Найти цитируемый пост)
А еще проверка нужна, что бы пользователь ($user[login]) не мог голосовать несколько раз.. Как реализовать ?

Связующую табличку делай
Код

file_id   |   user_id



--------------------
В искаженном мире все догмы одинаково произвольны, включая догму о произвольности догм.
-----
PM WWW ICQ Skype   Вверх
-=Ustas=-
Дата 15.3.2007, 15:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ustix IT Group
****


Профиль
Группа: Участник Клуба
Сообщений: 2222
Регистрация: 21.1.2005
Где: Краснодар

Репутация: 32
Всего: 69



Как и обещал... Значит создаем таблички:
Таблица для контента, что там у кого храниться, статьи или файлы, без разницы
Код

DROP TABLE IF EXISTS `contents`;
CREATE TABLE `contents` (
  `id` int(10) unsigned NOT NULL auto_increment,
  `title` varchar(255) NOT NULL default '',
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

далее создаем таблицы для рейтинга
Код

# Связующая таблица результатов, содержит ссылки на контент и опции рейтинга
DROP TABLE IF EXISTS `rating_references`;
CREATE TABLE `rating_references` (
  `roption_id` int(11) NOT NULL default '0',
  `content_id` int(11) NOT NULL default '0',
  `date` int(11) NOT NULL default '0',
  KEY `roption_id` (`roption_id`),
  KEY `content_id` (`content_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

# Опции рейтинга, т.е. задаем диапазон рейтингов
DROP TABLE IF EXISTS `rating_options`;
CREATE TABLE `rating_options` (
  `id` int(10) unsigned NOT NULL auto_increment,
  `option` int(11) NOT NULL default '0',
  PRIMARY KEY  (`id`),
  UNIQUE KEY `option` (`option`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

# Вычисленные результаты. Можно сюда записывать результаты, если контент не слишком часто обновляется
# в своем примере я ее не использую, т.е. можно обходиться и без нее, но на вский :)
DROP TABLE IF EXISTS `rating_results`;
CREATE TABLE `rating_results` (
  `content_id` int(11) NOT NULL default '0',
  `rating_count` int(11) NOT NULL default '0',
  `sum_rating` int(11) NOT NULL default '0'
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

теперь создаем представление, тобишь VIEW, для облегчения жизни при расчете рейтингов
Код

DROP TABLE IF EXISTS `rating_results_view`;
DROP VIEW IF EXISTS `rating_results_view`;

CREATE VIEW `rating_results_view` AS 
    SELECT 
        `ref`.`content_id`, 
        COUNT(*) AS `rating_count`, 
        SUM(`opt`.`option`) AS `sum_rating` 
        FROM 
            `rating_references` AS `ref`
        LEFT JOIN 
            `rating_options` AS `opt`
        ON
            `ref`.`roption_id` = `opt`.`id` 
        GROUP BY 
            `ref`.`content_id`;

Теперь, допустим у нас есть статьи, например десять (количество не важно, рейтинг высчитывается на лету)
Код

INSERT INTO `contents` (`title`) VALUES ('Первая статья'),('Вторая статья'),('Третья статья'),('Четвертая статья'),('Пятая статья'),('Шестая статья'),('Седьмая статья'),('Восьмая статья'),('Девятая статья'),('Десятая статья');

И мы хотим повесить н аних рейтинг от 1 до 7 (к примеру)
Код

INSERT INTO `rating_options` (`option`) VALUES (1),(2),(3),(4),(5),(6),(7);

ну и скриптик, который я писал для тестов, чтоб наглядно было видно работу этого всего
Код

<?php

header( 'Content-Type: text/html; charset=UTF-8' );

$link = mysql_connect( 'localhost', 'admin', '123456789' );
mysql_select_db( 'rating' );

if ( isset( $_POST['id'] ) ) {
    
    $res = mysql_query( 'SELECT * FROM `rating_options` WHERE `option` = '.intval( $_POST['result'] ) );
    
    if ( $obj = mysql_fetch_object( $res ) ) {
        
        // Пишем в табличку результатов связей
        $sql = 'INSERT INTO `rating_references` VALUES('.$obj->id.', '.intval( $_POST['id'] ).', '.mktime().') ';
        mysql_query( $sql );
    }
}

// Вот собсна и сам запрос исходя из приведенной выше формулы, правда чуть преобразованный
// Таблица может быть любой, главное это вложенный запрос, который  ... ( *.* ) AS `rating` ... 
$sql = 'SELECT
            `c`.`id`,
            `c`.`title`,
            ( `vres`.`sum_rating` + 
                                   ( SELECT SUM(`rating_count`) * SUM(`sum_rating` / `rating_count`) FROM rating_results_view ) 
                                  / power( ( SELECT COUNT(`id`) FROM `contents` ), 2 ) 
            ) / ( `vres`.`rating_count` + 
                                         ( SELECT SUM(`rating_count`) FROM `rating_results_view` ) 
                                        / ( SELECT COUNT(`id`) FROM `contents` ) 
            ) AS `rating`
        FROM
            `contents` AS `c`
        LEFT JOIN
            `rating_results_view` AS `vres`
        ON
            `c`.`id` = `vres`.`content_id`
        ORDER BY 
            `rating`
        DESC';

$res = mysql_query( $sql ) or die( mysql_error() );
while ( $obj = mysql_fetch_object( $res ) ) {
    echo $obj->id.': '.$obj->title.'<br>'.$obj->rating.'<br><br>';
    
    ?>
    
    <form action="" method="POST">
    <input type="hidden" name="id" value="<?=$obj->id?>">
    
    <?
    
    $subres = mysql_query( 'SELECT `option` FROM `rating_options` ORDER BY `option` ASC' );
    
    while ( $option = mysql_fetch_object( $subres ) ) {
        
        echo '<input type="radio" value="'.$option->option.'" name="result"> '.$option->option.' &nbsp; ';
    }
    
    ?>
    
    <input type="submit" value="Send">
    </form>
    <hr>
    
    <?
}

?>


Добавлено @ 15:11 
Ну а сам вывод, навешивание звездочек и т.п. эт уже кто на что горазд ;)

Это сообщение отредактировал(а) -=Ustas=- - 15.3.2007, 15:33


--------------------
В искаженном мире все догмы одинаково произвольны, включая догму о произвольности догм.
-----
PM WWW ICQ Skype   Вверх
gta4kv
Дата 15.3.2007, 18:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Walking around mad.
***


Профиль
Группа: Завсегдатай
Сообщений: 1868
Регистрация: 25.7.2006

Репутация: 21
Всего: 91



Трындец!! Это клиника просто. =))

Спасиб за пример, ща разбираться буду.
PM MAIL   Вверх
gta4kv
Дата 16.3.2007, 16:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Walking around mad.
***


Профиль
Группа: Завсегдатай
Сообщений: 1868
Регистрация: 25.7.2006

Репутация: 21
Всего: 91



А без "VIEW" ни как?  smile У мну MySQL старый.  smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0571 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.