【发布时间】:2012-12-02 20:13:09
【问题描述】:
我需要写一个查询:
找出已发行电影的平均评分之间的差异 1980 年之前和 1980 年之后发行的电影的平均评分。 (确保计算每部电影的平均评分,然后 1980 年之前的电影和之后的电影的平均值。 不要只计算前后的整体平均评分 1980 年。)
架构如下:
Movie ( mID, title, year, director )
English: There is a movie with
ID number mID, a title, a release year, and a director.
Reviewer ( rID, name )
English: The reviewer with ID number rID has a certain name.
Rating ( rID, mID, stars, ratingDate )
English: The reviewer rID gave the movie mID a
number of stars rating (1-5) on a certain ratingDate.
以下是我提出的查询。结果是正确的,但绝对不是一个很好的查询:
select t1.p1-t2.p2 from
(select avg(average) as p1 from
(select g.mid,g.average, year from
(select mid, avg(stars) as average from rating
group by mid) g, movie
where g.mid=movie.mid) j
where year >= 1980) t1,
(select avg(average) as p2 from
(select g.mid,g.average, year from
(select mid, avg(stars) as average from rating
group by mid) g, movie
where g.mid=movie.mid) j
where year < 1980) t2;
以下是我如何得出这个查询。 首先,我编写了这个子查询来检索电影 id、该电影的平均评分、电影年份:
select g.mid,g.average, year from
(select mid, avg(stars) as average from rating
group by mid) g, movie
where g.mid=movie.mid
现在我需要使用相同的子查询来创建两个表,其中第一个表包含 1980 年之后电影的平均评分。第二个包含 1980 年之前电影的平均评分。在顶级查询中,我减去这 2 个价值观。
问题是我在两个地方复制了相同的代码。您能否从代码重复的角度以及性能的角度帮助优化代码?
【问题讨论】:
-
你想优化什么,效率还是优雅?如果你想要效率,你正在使用的 DBMS 是必需的。并非所有 SQL 都是一样的。
标签: sql query-optimization subquery