MySQL Sakila数佩内洛普·吉尼斯主演的电影
正如片名所说,我需要数一数佩内洛普主演了多少部电影,只知道他的名字和姓氏 我知道这会很重要,但我可以把问题拼凑起来,我能想出的最好办法是: 从film_actor中选择COUNT*,其中从actor.first_name=佩内洛普和actor.last_name=吉尼斯中选择actor.actor_id 而且它并没有真正返回我需要的数据,它只是计算电影中所有演员的idMySQL Sakila数佩内洛普·吉尼斯主演的电影,mysql,sql,Mysql,Sql,正如片名所说,我需要数一数佩内洛普主演了多少部电影,只知道他的名字和姓氏 我知道这会很重要,但我可以把问题拼凑起来,我能想出的最好办法是: 从film_actor中选择COUNT*,其中从actor.first_name=佩内洛普和actor.last_name=吉尼斯中选择actor.actor_id 而且它并没有真正返回我需要的数据,它只是计算电影中所有演员的id 它返回的计数是5462,而不是19。请添加film_actor和actor的表定义 我的第一次尝试是 SELECT COUNT(
它返回的计数是5462,而不是19。请添加film_actor和actor的表定义 我的第一次尝试是
SELECT COUNT(*) FROM film_actor AS f JOIN actor AS a ON f.actor_id = a.actor_id WHERE a.first_name = "PENELOPE" AND a.last_name = "GUINESS";
这将连接桌上电影演员和桌上演员。但不是每一行,只有参与者id相同的行。像这样
[film_actor] [actor]
movie_name | actor_id actro_id | first_name | last_name
-----------+---------- ---------+------------+-----------
AAA | 15 15 | PENELOPE | GUINESS
BBB | 11 11 | aaa | last_aaa
CCC | 15 10 | bbb | last_bbb
DDD | 10 69 | xxx | last_xxx
XXX | 69
[JOIN Table]
movie_name | actro_id | first_name | last_name
-----------+----------+------------+-------------
AAA | 15 | PENELOPE | GUINESS
BBB | 11 | aaa | last_aaa
CCC | 15 | PENELOPE | GUINESS
DDD | 10 | bbb | last_bbb
AAA | 69 | xxx | last_xxx
然后只取first_name=PENELOPE和last_name=GUINESS的行
并计算行数您的子查询将在许多数据库中返回错误,因为actorid不是有效的比较。它不能与任何东西相比 MySQL允许这样做,将0视为false,将其他值视为true。因此,where子句可能对所有行的计算结果都为true 有两个问题需要解决: 子查询应该逐行检查外部查询中的参与者。这称为关联子句。 您希望存在,而不仅仅是返回任意id。 因此,您试图编写的查询似乎是:
SELECT COUNT(*)
FROM film_actor fa
WHERE EXISTS (SELECT 1
FROM actor a
WHERE a.actor_id = fa.actor_id AND
--------------------^ correlation clause
a.first_name = 'PENELOPE' AND
a.last_name = 'GUINESS'
);
注意:这假设演员在一部电影中没有多个角色会在电影中多次列出。如果可能,您希望:
在where子句后面应该有FIMMEL_actor table字段来与actor.actor_id进行比较,比如select actor.actor_id中的where FIMMEL_actor.actor_id…FIMMEL_actor table的模式是什么?我怀疑佩内洛普更喜欢代词“her”,如果FIMMEL_actor table表中包含“role”,那么它不包含“role”—但假设,那么,同一个演员可能会多次与同一部电影联系在一起,在这种情况下,我们需要COUNTDISTINCT film_id,但对于实际场景来说,上述情况是可以接受的。
SELECT COUNT(DISTINCT fa.film_id)