Как получить счет определенной категории за каждый год? - PullRequest
0 голосов
/ 17 мая 2019

Я пытаюсь решить проблему, в которой говорится, что «Для каждого года подсчитайте количество фильмов в этом году, в которых были только женщины-актеры».

Схема таблицы выглядит следующим образом:

--------------------   -----------------------   ----------------------
|   Movie          |   |     Person           |  |       Cast         |
--------------------   ------------------------  ----------------------
| MovieID  | year  |   |  PersonID  | Gender  |  | MovieID | PersonID |
--------------------   ------------------------  ----------------------

Выполнение следующего запроса:

SELECT M.YEAR, COUNT(M.MID) NUMBER_OF_FEMALE_ONLY_MOVIES FROM MOVIE M 
WHERE M.MID IN (SELECT X.MID FROM (SELECT AX.MID, COUNT(AX.PID) TOTAL_CAST 
FROM M_CAST AX GROUP BY AX.MID) X 
WHERE 
X.TOTAL_CAST = (SELECT COUNT(A.PID) FROM M_CAST A, PERSON B WHERE A.MID = 
X.MID AND
TRIM(B.PID) = TRIM(A.PID) AND B.GENDER = 'Female')) GROUP BY M.YEAR

Мои результаты:

---------------------------------------
| year | NUMBER_OF_FEMALE_ONLY_MOVIES  |
---------------------------------------
| 1999 |    1                          |
| 2005 |    1                          | 
| 2009 |    1                          |
| 2012 |    1                          |
| 2018 |    1                          |
----------------------------------------

Но мне нужно вернуть 0 в качестве отсчёта за годы, в которых нет таких фильмов. Например.

2013 0

Ответы [ 3 ]

0 голосов
/ 17 мая 2019

Я думаю, что проблема может быть решена путем объединения всех таблиц и фильтрации по предложению WHERE для женщин-актеров. В этом случае объединение таблиц также даст лучшую производительность, чем подзапрос.

Пожалуйста, попробуйте следующий код:

Select year, count(*) 
from movie join Cast on movie.movieid=cast.movieid
join person on person.personid=cast.personid
where person.gender='Female'
group by year

Пожалуйста, дайте мне знать, если это хорошо для вас.

0 голосов
/ 17 мая 2019

Попробуйте - требуется РАЗЛИЧНЫЙ Идентификатор MovieID, так как для одного фильма может быть несколько женских кастингов.Distinct предоставит фактическое количество фильмов.

SELECT 
M.Year,
COUNT(DISTINCT MovieID)  
FROM Movie M
INNER JOIN Cast C ON M.MovieID = C.MovieID
INNER JOIN Person P ON C.PersonID = P.PersonID 
WHERE P.Gender = 'Female'
GROUP BY M.Year;
0 голосов
/ 17 мая 2019

Вам нужна только группа с подзапросом, так как вам нужна ссылка на киноид персон с полом как женщина лично

     SELECT YEAR, COUNT(*) FROM 
     MOVIE 
    Where MovieId IN (SELECT MOVIEId 
   from CAST WHERE PERSONID IN 
   (Select PersonId from Person Where 
    Gender ='FEMALE'))
    Group by Year 
...