MySQL Sakila数佩内洛普·吉尼斯主演的电影

MySQL 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(

正如片名所说,我需要数一数佩内洛普主演了多少部电影,只知道他的名字和姓氏

我知道这会很重要,但我可以把问题拼凑起来,我能想出的最好办法是:

从film_actor中选择COUNT*,其中从actor.first_name=佩内洛普和actor.last_name=吉尼斯中选择actor.actor_id

而且它并没有真正返回我需要的数据,它只是计算电影中所有演员的id


它返回的计数是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)