SQL - 查找具有最多外观的对象

时间:2014-10-30 06:06:39

标签: mysql sql database

我是SQL的新手,正在完成一项任务,找到最具外表的演员或女演员。我正在使用的数据库图表如下: http://i.imgur.com/kj8qVgF.png 这是我试图使用的查询:

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) ...

提示?

2 个答案:

答案 0 :(得分:0)

试试这个

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
LEFT JOIN role_type r
ON c.role_id = r.id
AND (r.role = 'actor' OR r.role = 'actress')
GROUP BY n.name

答案 1 :(得分:0)

我将为你解决这些问题,因为这项任务显然会给你带来麻烦。

您可以在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