一直在研究这个问题几个小时已经接近但仍然无法得到我想要的结果.以下是以下问题:
对于平均评分为4星或更高的所有电影,请在发行年份添加25.(更新现有行;不要插入新行.).
此查询所需的表格是我已在此处发布的另一个问题,如何获取此特定"查询"的结果.表名是"电影"和"评级".你可以看到一些sql代码,如果它会有所帮助.
我解决这个问题的第一步是(显然)寻找平均评分为4星或更高的电影.我用以下查询做到了:
SELECT movie.mid, aveMovieRating
FROM movie JOIN(
SELECT DISTINCT(rating.mid),
COUNT(mid) AS "Number of movies",
SUM(stars) AS "Total no# of stars",
(SUM(stars)*1.0/COUNT(mid)) AS aveMovieRating
FROM rating
GROUP BY mid
) AS aveRating
ON movie.mid = aveRating.mid
WHERE aveMovieRating >= 4
Run Code Online (Sandbox Code Playgroud)
然后我来到了棘手的部分 - 根据问题要求尝试改变发布年份...这是我想出的用于尝试的查询:
UPDATE movie
SET year = (year + 25)
WHERE movie.mid IN(
SELECT movie.mid, aveMovieRating
FROM movie JOIN(
SELECT DISTINCT(rating.mid),
COUNT(mid) AS "Number of movies",
SUM(stars) AS "Total no# of stars",
(SUM(stars)*1.0/COUNT(mid)) AS aveMovieRating
FROM rating
GROUP BY mid
) AS aveRating
ON movie.mid = aveRating.mid
WHERE aveMovieRating >= 4)
Run Code Online (Sandbox Code Playgroud)
执行以上查询会在SQLite中生成以下SQL错误:
错误:只有一个结果允许SELECT作为表达式的一部分
这是我第一次尝试"复杂"的问题而没有获得外界帮助,但是这个错误让我失望了.如果有人能够帮助我改变上面的查询,并给出一些关于这类问题的指示,那就太棒了:).
从选择列表中删除aveMovieRating.该错误清楚地表明:"只允许单一结果......".IN运算符处理一组单列行.
更新:
至于更新,您可以通过删除不必要的列来压缩它:
UPDATE movie
SET year = (year + 25)
WHERE movie.mid IN (
SELECT rating.mid
FROM rating
GROUP BY mid
HAVING avg(Stars) >= 4
)
Run Code Online (Sandbox Code Playgroud)