2016-12-02 50 views
0

我有一个问题,我想列出数据库中每个电影的所有演员。现在我有这个SQLSQL调用所有字段

SELECT title, count(1) COUNT, actor.first_name, actor.last_name 
FROM film 
INNER JOIN film_actor ON film.film_id = film.actor.film_id 
INNER JOIN actor ON film_actor.actor_id = actor.actor_id 
GROUP BY title. 

我所试图做的是格式我出来放到一个文本文件中是这样的:

Title:Number of Actors in each film: Actor first name(1): Actor last name(2) : Actor first name(2): Actor last name(2) ... ect 

但是例如,在第一部电影有十actots为这部电影。我将如何打印每部电影的每个演员的名字和姓氏。

+0

您是否想要查看电影中演员的具体(#)?基于什么顺序? (我知道在mysql中这样做的唯一方法是使用用户变量。例如:http://stackoverflow.com/questions/8359077/mysql-running-total-with-count – xQbert

+0

或者你也许只需要模拟' ()通过xxxx分区)'功能:http://blog.sqlauthority.com/2014/03/09/mysql-reset-row-number-for-each-group-partition-by-row-number/ – xQbert

回答

1

问题是你想要聚合和非聚合数据。

在MySQL中实现此目的的一种方法是,您必须将每部电影中演员的计数作为子查询并返回到基本集。

SELECT title, b.cnt COUNT, actor.first_name, actor.last_name 
FROM film 
INNER JOIN film_actor 
    ON film.film_id = film_actor.film_id 
INNER JOIN actor 
    ON film_actor.actor_id = actor.actor_id 
INNER JOIN (SELECT film_ID, count(1) as cnt 
      FROM film_actor 
      GROUP BY film_ID) B 
on film.film_ID = B.Film_ID 

在数据库支持,你可以使用窗口功能count(1) over (parttition by film.film_ID) as cnt

它也能够通过使用一组由累积来实现,而无需使用附加的连接;但是这会创造一个额外的行。

SELECT title, count(1) COUNT, actor.first_name, actor.last_name 
FROM film 
INNER JOIN film_actor 
    ON film.film_id = film_actor.film_id 
INNER JOIN actor 
    ON film_actor.actor_id = actor.actor_id 
on film.film_ID = B.Film_ID 
GROUP BY title with rollup