我正在使用3个表:演员,电影和actor_film。演员和电影只有2个字段:id(主键)和名称。 Actor_film还有2个字段,演员和电影,它们分别是代表演员和电影ID的外键。因此,如果一部电影中有4位演员,那么就有4部关于同一部电影和4位不同演员的actor_film参赛作品。
我的问题是,鉴于某个演员的身份,我想要回复演员身份,演员姓名,电影名称以及该影片中演员的总人数。但是,我想要展示的唯一演员是其名字中包含某些字母的演员。
让我用一个例子来澄清事情。说Tom Hanks只有2部电影,Forrest Gump和Saving Private Ryan,而且我正在寻找那些拥有" Gary"或者"马特"在他们的名字。进一步假设Forrest Gump有4名演员,Save Saving Ryan有5名演员。然后,我唯一想要返回的就是(当然没有列名)
actor id | actor name | film name | # actors
abcdefg | Gary Sinise | Forrest Gump | 4
hijklmn | Matt Damon | Saving Private Ryan | 5
opqrstu | Paul Giamatti | Saving Private Ryan | 5
目前,我使用以下方式占75%:
SELECT actor.id, actors.name, films.name,
FROM (
SELECT actor_film.film
FROM actor_film, actors
WHERE actor_film.actor = actors.id
) AS a, actor_film, actors, films
WHERE actor_film.film = a.film
AND actors.id = actor_film.actor
AND films.id = a.film;
这是返回的东西:
arnie | Arnold Schwarzenegger | Around the World in 80 Days
arnie | Arnold Schwarzenegger | Around the World in 80 Days
对于一部有2名演员的电影。换句话说,我无法取出电影中所有不同的演员,但是隐含地使用COUNT
明确地计算它。
无论如何,我想我正在寻找某种INNER JOIN
或嵌套的SELECT
,但我是SQLite3的新手,并且不知道如何带来这些一起。任何解决方案都会很棒,而且除此之外的任何解释都会很棒。
答案 0 :(得分:0)
您不应该使用旧式连接。他们在95年就已经老了,当时让你做得更清晰的新标准更加清晰。
我注意到你也使用复数作为你的表名(例如“演员”)标准样式是使用单数作为表格名称(例如“演员”)
我在下面使用这两个建议,我也会向您展示每一步。我建议您为每个步骤运行查询并查看输出以了解一切是如何工作的,因为您不熟悉SQL。
好的,让我们一步一步带你解决问题。首先要看到每个演员和他们所在的电影(你的前3列)都这样做:
SELECT a.id as actor_id, a.name as actor_name, f.name as film_name
FROM actor as a
JOIN actor_film af on a.id = af.actor
JOIN film as f on af.film = f.id
您可以使用以下查询找到您的上一栏:
SELECT af.film as film_id, count(*) as c
FROM actor_film as af
GROUP BY af.film
现在我们一起加入他们
SELECT a.id as actor_id, a.name as actor_name, f.name as film_name, fc.c as num_actors
FROM actor as a
JOIN actor_film af on a.id = af.actor
JOIN film as f on af.film = f.id
JOIN (
SELECT af.film as film_id, count(*) as c
FROM actor_file as af
GROUP BY af.film
) as fc on af.film = fc.film_id
如果您愿意,可以添加
WHERE a.name = 'Gary' OR a.name = 'Matt'
取决于您可能需要的平台
WHERE lower(a.name) = 'gary' OR lower(a.name) = 'matt'