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 >
3 Réponses :
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
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;
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).
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