1
votes

Renvoyez l'entreprise avec la plupart des films d'un genre

Je travaille sur ce projet dans mon université, où je dois créer une requête dans la base de données. Je souhaite que la requête renvoie la société avec la plupart des films du genre donné. Pour le moment, j'ai cette requête, mais cela ne renvoie qu'une seule entreprise, mais il peut probablement y en avoir plus d'une.

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

Je crois que j'aurai besoin d'un «avoir» ici. P >


2 commentaires

Vous avez donc des données et lorsque vous exécutez cette instruction select sur ces données, vous récupérez une ligne et vous en attendez plus d'une? Pensez-vous que nous devrions avoir une partie de ces données pour que nous puissions essayer de vous aider? Et s'il vous plaît, avec ces données, ajoutez vos résultats attendus et partagez avec nous quelle base de données utilisez-vous?


@Jonas, veuillez vérifier si cela aide


3 Réponses :


0
votes

Veuillez essayer ceci, c'est peut-être parce que vous avez ajouté la limite 1 , qui n'affiche que le premier enregistrement récupéré

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 


0 commentaires

0
votes

Je suppose que par "catégorie" vous voulez dire "genre" - ou qu'ils sont la même chose.

N'utilisez pas NATURAL JOIN . Il n'utilise même pas les relations de clé étrangère correctement déclarées, se basant simplement sur la similitude de nom entre les tables. C'est dangereux car les colonnes utilisées ne sont pas spécifiées et peuvent introduire des erreurs difficiles à déboguer. Je l'appelle souvent une "abomination" car elle ne prend pas en compte les déclarations de table.

Si vous avez une catégorie donnée, alors je m'attendrais à une clause 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 commentaires

0
votes

Si vous souhaitez autoriser les égalités, vous pouvez utiliser la fonction de fenêtre 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

Cela vous donne la meilleure entreprise pour chaque catégorie, liens inclus. Si vous souhaitez filtrer sur une catégorie donnée, vous pouvez simplement ajouter une clause where à la requête interne.

Remarque: n'utilisez pas de jointure naturelle code > s: ils sont sujets aux erreurs. J'ai réécrit la requête pour utiliser à la place des jointures internes (j'ai fait quelques hypothèses sur les relations).


0 commentaires