Верните компанию с большинством фильмов в жанре - PullRequest
1 голос
/ 10 марта 2020

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

SELECT CompanyID, CategoryID, COUNT(*) as NumberOfMovies
FROM Movie
    NATURAL JOIN CategoryFilm
    NATURAL JOIN Category
    NATUAL JOIN Comapny
    GROUP BY CategoryID, CompanyID
    Order by NumberOfMovies DESC LIMIT 1

Я полагаю, мне здесь понадобится «иметь».

Ответы [ 3 ]

0 голосов
/ 10 марта 2020

Я предполагаю, что под "категорией" вы подразумеваете "жанр" - или что это одно и то же.

Не используйте NATURAL JOIN. Он даже не использует должным образом объявленные отношения внешнего ключа, а полагается только на сходство имен между таблицами. Это опасно, поскольку используемые столбцы не указаны и могут привести к ошибкам, которые трудно отладить. Я часто называю это «мерзостью», потому что она не учитывает объявления таблиц.

Если у вас есть заданная категория, то я бы ожидал предложение WHERE:

SELECT CompanyID, COUNT(*) as NumberOfMovies
FROM Movie m JOIN
     CategoryFilm cf
     ON cf.movie_id = m.movie_id JOIN
     Company c
     ON c.company_id = m.company_id
WHERE cf.category_id = ?
GROUP BY CategoryID
ORDER BY NumberOfMovies DESC
LIMIT 1;
0 голосов
/ 10 марта 2020

Если вы хотите разрешить связи, вы можете использовать оконную функцию rank():

select *
from (
    select 
        co.companyID,
        ca.categoryID,
        count(*) NumberOfMovies,
        rank() over(partition by c.categoryID order by count(*) desc) rn
    from movie m
    inner join categoryFilm cf on cf.movieID = m.movieID
    inner join category ca     on ca.categoryID = cf.categoryID
    inner join company co      on co.companyID = m.companyID
    group by co.companyID, ca.categoryID
) t
where rn = 1
order by ca.categoryID

Это дает вам лучшую компанию для каждой категории, включая связи. Если вы хотите выполнить фильтрацию по данной категории, вы можете просто добавить предложение where во внутренний запрос.

Примечание: не используйте natural join s: они подвержены ошибкам. Я переписал запрос, чтобы использовать вместо него inner join s (я сделал несколько предположений об отношениях).

0 голосов
/ 10 марта 2020

Пожалуйста, попробуйте, возможно, потому что вы добавили limit 1, который показывает только 1-ю полученную запись

SELECT CompanyID, CategoryID, COUNT(*) as NumberOfMovies
FROM Movie
    NATURAL JOIN CategoryFilm
    NATURAL JOIN Category
    NATURAL JOIN Comapny
    GROUP BY CategoryID, CompanyID
    Order by NumberOfMovies DESC 
...