我是SQL的新手,正在从事一项任务以寻找出场次数最多的演员。我正在使用的数据库图在这里:

这是我尝试使用的查询:

SELECT DISTINCT n.name, count(n.name)
FROM cast_info c
INNER JOIN name n
ON (n.id = c.person_id)
INNER JOIN title t
ON (c.movie_id = t.id)
CROSS JOIN role_type r
WHERE (r.role = 'actor' OR r.role = 'actress')
GROUP BY n.name


这样做是为了统计不同演员的出现次数,然后我可以对其进行排序并选择排名第一的演员。但这是行不通的。我做的其他事情是:

SELECT n.name, count(n.name) AS amount
FROM cast_info c
INNER JOIN name n
ON (n.id = c.person_id)
INNER JOIN title t
ON (c.movie_id = t.id)
LEFT JOIN role_type r
ON c.role_id = r.id
AND (r.role = 'actor' OR r.role = 'actress')
GROUP BY amount
ORDER BY amount DESC
LIMIT 1


但这给出了错误

aggregate functions are not allowed in GROUP BY
LINE 1: SELECT COUNT(*) AS total FROM (SELECT n.name, count(n.name) ...


提示?

最佳答案

我将为您解答所有这些问题,因为此作业显然给您带来了麻烦。

您可以在cast_info表和role_type表中找到所需的所有内容,除非您需要显示演员的实际姓名。

我将从选择代表电影中演员的所有行开始。这应该是一个独特的组合,因为一个人不能两次出演同一部电影中的演员。完成此操作后,请按人员ID分组,并获得count()行,该行实际上应该是电影的数量。我认为您收到的错误完全是由于听起来的原因,您不能在订单依据中使用汇总列。一种解决方法是将其用作子查询,并使用MAX()获得最多的外观。

尝试这个:

SELECT c.personid, MAX(numMovies) AS mostApperances
FROM(SELECT c.personid, COUNT(*) AS numMovies
     FROM cast_info c
     JOIN role_type r ON r.id = c.role_id
     WHERE r.role = 'actor' OR r.role = 'actress'
     GROUP BY c.personid) t

关于mysql - SQL-查找外观最多的对象,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26646138/

10-11 02:34