该数据库来自CS50的《计算机科学导论》课程Pset7|Movies。https://cs50.harvard.edu/x/2022/psets/7/movies/
当我运行此命令时:
SELECT AVG(rating) FROM ratings WHERE movie_id = (SELECT id FROM movies WHERE year = 2012);
它返回:
+-------------+
| avg(rating) |
+-------------+
| |
+-------------+
尽管该查询适用于除2012年以外的任何值,例如:
sqlite> SELECT AVG(rating) FROM ratings WHERE movie_id = (SELECT id FROM movies WHERE year = 2013);
+-------------+
| avg(rating) |
+-------------+
| 7.3 |
+-------------+
总和和查询如下:
SELECT AVG(rating) FROM ratings WHERE
movie_id = (SELECT id FROM movies WHERE year > 2011 AND year < 2013);
返回与之前完全相同的空白表,计数返回0。
+---------------+
| Count(rating) |
+---------------+
| 0 |
+---------------+
我到底做错了什么?如果需要更多的信息,一定要让我知道。
[编辑]
人工交叉引用的一个例子;
SELECT id, title, year FROM movies WHERE year = 2012 LIMIT 1;
+--------+-----------------------+------+
| id | title | year |
+--------+-----------------------+------+
| 383010 | The Three Stooges | 2012 |
+--------+-----------------------+------+
SELECT rating FROM ratings WHERE movie_id = 383010;
+--------+
| rating |
+--------+
| 5.1 |
+--------+
表详细信息:
CREATE TABLE movies (
id INTEGER,
title TEXT NOT NULL,
year NUMERIC,
PRIMARY KEY(id)
);
CREATE TABLE stars (
movie_id INTEGER NOT NULL,
person_id INTEGER NOT NULL,
FOREIGN KEY(movie_id) REFERENCES movies(id),
FOREIGN KEY(person_id) REFERENCES people(id)
);
CREATE TABLE directors (
movie_id INTEGER NOT NULL,
person_id INTEGER NOT NULL,
FOREIGN KEY(movie_id) REFERENCES movies(id),
FOREIGN KEY(person_id) REFERENCES people(id)
);
CREATE TABLE ratings (
movie_id INTEGER NOT NULL,
rating REAL NOT NULL,
votes INTEGER NOT NULL,
FOREIGN KEY(movie_id) REFERENCES movies(id)
);
CREATE TABLE people (
id INTEGER,
name TEXT NOT NULL,
birth NUMERIC,
PRIMARY KEY(id)
);
[编辑2]我想我可能发现了错误,
+--------+-----------------------+------+
| id | title | year |
+--------+-----------------------+------+
| 139613 | O Silêncio | 2012 |
+--------+-----------------------+------+
在其他ID中,此ID不返回评级
sqlite> SELECT rating FROM ratings WHERE movie_id = 139613;
sqlite>
也许这与这个错误有关,尽管如前所示,许多电影确实有评级。那么,如果这就是问题所在,那么有没有办法解决它呢?这样我就可以得到有价值的AVG评级,而忽略没有评级的电影?
2条答案
按热度按时间3vpjnl9f1#
查询的问题是使用运算符
=
将movie_id
与子查询的结果进行比较:在本例中,SQLite仅使用表
movies
中的一个任意id
(它是结果集的第一个)作为子查询的结果,而子查询可能没有任何评级。请改用运算符
IN
:rwqw0loc2#
前两个带有“WHERE Year=2012”和“Year=2013”的查询告诉我们,表中根本没有2012年的数据。
下一个带有“here Year>2011 and Year<2013”的查询尝试选择年份小于2013年的数据。
因此,2013年被过滤掉了,不会显示出来。您所需要做的就是更改查询以将2013年考虑在内: