2014-10-30 6 views
0

Я новичок в SQL, работающий над заданием, чтобы найти актера или актрису с наибольшим количеством выступлений. Схема базы данных я работаю здесь: http://i.imgur.com/kj8qVgF.png Здесь был вопрос, я пытался использовать: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) ... 

советы?

+0

я не упомянул об этом в моем ответе, но причина, вы получаете сообщение об ошибке, потому что вы не можете сгруппировать по совокупному колонку. Сумма считается совокупностью, потому что она что-то подсчитывает, и она получает подсчет от группы. Он не может получить счет от себя. – AdamMc331

ответ

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 
+0

Я пробовал это, и запрос не смог обработать даже через 10 минут. –

0

Я собираюсь принять удар на каждый из этих вопросов для вас, потому что это назначение явно причиняет вам неприятности.

Вы можете найти все, что вам нужно, в таблице cast_info и таблице role_type, если вам не нужно отображать фактическое имя актеров/актрис.

Я бы начал с выбора всех строк, которые представляют актера или актрису в фильме. Это должна быть уникальная комбинация, поскольку человек не может быть актером в одном фильме дважды. После того, как вы это сделали, сгруппируйте идентификаторы лиц и получите 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 
Смежные вопросы