0

私はこのようなことを達成する必要があります

SELECT ISNULL(AVG(rating),0) FROM videorating vr WHERE vr.VideoId=11229;

平均が空/nullの場合、評価として0を取得する必要があります。

このクエリを最適化しようとしています

SELECT CASE ISNULL(AVG(rating)) WHEN 0 THEN AVG(rating) ELSE 0 END AS rating FROM videorating WHERE videoID=11229;
4

1 に答える 1

0

個人的には、トリガーを使用して平均評価を維持します。これは、データベースのサイズが大きくなるにつれてはるかに効率的になるためです。その後、次のように簡単に実行できます。

select rating from video where video_id = 1;

完全なスクリプトは次のとおりです。

drop table if exists video;
create table video
(
video_id int unsigned not null auto_increment primary key,
title varchar(255) not null,
num_votes int unsigned not null default 0,
total_score int unsigned not null default 0,
rating decimal(8,2) not null default 0
)
engine = innodb;

drop table if exists video_vote;
create table video_vote
(
video_id int unsigned not null,
user_id int unsigned not null,
score tinyint unsigned not null default 0, -- 0 to 5
primary key (video_id, user_id)
)
engine=innodb;

delimiter #

create trigger video_vote_after_ins_trig after insert on video_vote
for each row
begin
 update video set 
    num_votes = num_votes + 1,
    total_score = total_score + new.score,
    rating = total_score / num_votes  
 where 
    video_id = new.video_id;
end#

delimiter ;

insert into video (title) values ('video 1'),('video 2'), ('video 3');

insert into video_vote (video_id, user_id, score) values
(1,1,5),(1,2,4),(1,3,3),(1,4,2),(1,5,1),
(2,1,2),(2,2,1),(2,3,4),
(3,1,4),(3,5,2);

select rating from video where video_id = 1;
于 2011-02-28T10:09:19.410 に答える