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