使用重复条目和COUNT嵌套SELECT语句

时间:2017-03-05 22:45:50

标签: sql database sqlite

我正在使用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的新手,并且不知道如何带来这些一起。任何解决方案都会很棒,而且除此之外的任何解释都会很棒。

1 个答案:

答案 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'