Торт PHP показать видео ORDER BY рейтинг - PullRequest
0 голосов
/ 02 августа 2011

Теперь я начал знакомиться с Cake PHP.

Следующая проблема: У меня есть две таблицы. Две модели выглядят так:

class Video extends AppModel {
var $ name = 'Video';
var $ hasMany = array ('Rating' =>
array ('className' => 'Rating',
'foreignKey' => 'model_id'
'Conditions' => array ('Rating.model' => 'Video');
'dependent' => true,
'exclusive' => true
)
);
}


class Rating extends Model {
var $ name = 'Rating';

var $ validate = array ('user_id' => array ('rule' => array ('MaxLength', 36),
'required' => true);
'model_id' => array ('rule' => array ('MaxLength', 36),
'required' => true);
'model' => array ('rule' => 'alphanumeric',
'required' => true));
}

Похоже, что запрос работает:

$ this-> paginate = array (
'Video' => array (
'limit' => 15,
'page' => 1,
'order' => array (
'Video.id' => 'DESC')
)
);
$ this-> set ('videos', $ this-> paginate ("Video"));

Я бы хотел отсортировать по рейтингу

Мои таблицы:

CREATE TABLE `ratings` (
  `id` int(11) unsigned NOT NULL auto_increment,
  `user_id` char(36) NOT NULL default '',
  `model_id` char(36) NOT NULL default '',
  `model` varchar(100) NOT NULL default '',
  `rating` tinyint(2) unsigned NOT NULL default '0',
  `name` varchar(100) default '',
  `created` datetime default NULL,
  `modified` datetime default NULL,
  PRIMARY KEY  (`id`),
  KEY `rating` (`model_id`,`model`,`rating`,`name`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=15 ;

CREATE TABLE `videos` (
  `id` int(11) NOT NULL auto_increment,
  `link` varchar(200) NOT NULL,
  `date` datetime NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=61 ;

Заранее спасибо за ответы.

Извините за мой английский

1 Ответ

0 голосов
/ 03 августа 2011

По моему мнению, у вас должно быть среднее поле рейтинга в вашей видео таблице.Это повысит производительность и упростит выполнение того, о чем вы просили выше.

После того, как пользователь добавит новый рейтинг.Используйте следующую формулу для пересчета поля:

new_avg_rating = (old_avg_rating + rating) / rating_count;

Аналогично, если пользователь удаляет оценку:

new_avg_rating = (old_avg_rating - rating / rating_count;

«рейтинг» - это добавляемый или удаляемый рейтинг,количество записей в таблице «рейтинг» для этого видео.Поскольку вы делаете это после добавления / удаления нового рейтинга в таблице, он уже включает новый рейтинг.

...