Внутреннее соединение SQL с условием count() и реляционной алгеброй

У меня есть эти таблицы:

  • Фильмы (id, name)

  • В ролях (idmovie, actor)

И я хотел бы подсчитать количество актеров для каждого фильма, а затем получить только фильмы с более чем 10 актерами. У меня есть запрос на подсчет количества актеров для каждого фильма, который выглядит следующим образом:

SELECT idmovie, count(actor) FROM Cast GROUP BY idmovie HAVING count(actor) > 10;

Теперь мне интересно, как получить этот результат и присоединить его к таблице Movies. Я старался:

SELECT name FROM Movies INNER JOIN (SELECT idmovie FROM Cast GROUP BY idmovie HAVING count(actor) >2) Cast ON Cast.idmovie = Movies.id;

Но это не работает.

Я также должен перевести это на реляционную алгебру.

π name (σ (count(σ id = idmovie))) Movies⨝Cast

Что явно неправильно...

Любая помощь?


person Synor    schedule 12.10.2015    source источник
comment
Делайте обычный INNER JOIN — подзапросы не нужны.   -  person PM 77-1    schedule 12.10.2015


Ответы (2)


Попробуй это...

SELECT m.name, COUNT(c.actor) AS 'ActorsCount' 
FROM Movies m INNER JOIN [Cast] c ON m.id = c.idmovie
GROUP BY m.name HAVING COUNT(c.actor) > 10;
person japzdivino    schedule 12.10.2015
comment
У меня возникли ошибки при использовании 'ActorsCount' и [Cast], мне пришлось удалить '' и []. Теперь это работает. Спасибо! - person Synor; 12.10.2015
comment
@Nicolas, хм, может быть, из-за вашей СУБД у вас возникла ошибка, я предполагаю, что вы используете sql-сервер, поэтому я написал, что вы хотите, используя sql-сервер :), в любом случае важна логика, и я рад, что помог. :) , в следующий раз отмечайте dbms. :) - person japzdivino; 12.10.2015

Запрос выглядит правильно для меня, за исключением, возможно, того, что вы назвали вложенный запрос псевдонимом Cast, который также является именем таблицы. Я не уверен, какой эффект это окажет, но я ожидаю, что это запутает MySQL. Попробуйте следующее:

SELECT name FROM Movies INNER JOIN
(SELECT idmovie FROM Cast GROUP BY idmovie HAVING count(actor) >2) CastCount
ON CastCount.idmovie = Movies.id;

Я не пробовал, но думаю, что это сработает

person Oliver Dain    schedule 12.10.2015