为什么SQLite3用于查找该数据库的AVG、COUNT和SUM时不返回任何内容?

rkkpypqq  于 2022-11-15  发布在  SQLite
关注(0)|答案(2)|浏览(185)

该数据库来自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评级,而忽略没有评级的电影?

3vpjnl9f

3vpjnl9f1#

查询的问题是使用运算符=movie_id与子查询的结果进行比较:

SELECT id FROM movies WHERE year = 2012

在本例中,SQLite仅使用表movies中的一个任意id(它是结果集的第一个)作为子查询的结果,而子查询可能没有任何评级。
请改用运算符IN

SELECT AVG(rating) FROM ratings WHERE movie_id IN (SELECT id FROM movies WHERE year = 2012);
rwqw0loc

rwqw0loc2#

前两个带有“WHERE Year=2012”和“Year=2013”的查询告诉我们,表中根本没有2012年的数据。
下一个带有“here Year>2011 and Year<2013”的查询尝试选择年份小于2013年的数据。
因此,2013年被过滤掉了,不会显示出来。您所需要做的就是更改查询以将2013年考虑在内:

AND year <= 2013

相关问题