2011-02-28 60 views
0

我需要实现一些这样的事AVG和ISNULL在MySQL

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

如果平均是空/空那么我应该得到0的评级。

我试图优化这个查询

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

问题是什么?你有错误吗?我认为你正在寻找的函数是'IFNULL(exp1,exp2)'。函数ISNULL(exp)只有一个表达式,并返回true或false。 – Galz 2011-03-03 19:59:14

回答

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;