Traduction avec un exemple: Par exemple, si je passe dans si je passe dans
Pour un ensemble donné de films, comment puis-je obtenir sa catégorie et dire si nous avons obtenu l'ensemble complet comme entrée ou non? Hobbit, Hellboy code> comme entrée, je devrais récupérer p>
hobbit, crépuscule code> comme entrée, je devrais revenir p >
SELECT Category, COUNT(*) AS GRP_COUNT
FROM movie
WHERE Movies IN (@movies)
GROUP BY Category
3 Réponses :
édité: strong> Donc, j'ai mal interprété la question et posté la mauvaise réponse précédemment. Mais ne vous inquiétez pas, j'ai apporté un amendement à la requête que j'ai postée plus tôt. En ce qui concerne "sans utiliser la sous-requête", je ne peux pas penser un moyen; p
Essayez ci-dessous Query:
Cela ne fonctionnera pas avec une variable comme dans la question de l'OPS car dans code> ne fonctionnera pas avec une chaîne qui est une liste séparée par des virgules. Vous devez utiliser
Find_in_set (film, @movies) code> à la place.
@Nick ne savait pas à propos de cette fonction! Merci beaucoup, très utile.
J'ai mis à jour votre requête et votre démo pour utiliser une variable et produire des résultats comme dans la question de l'OPS. db-fiddle.com/f/3slwwezxppfxkmfznpmnui/1
Cette requête a quelques parties difficiles:
Vous pouvez les résoudre à l'aide de l'agrégation conditionnelle. C'est-à-dire que le filtre dans les fonctions d'agrégation plutôt que dans le le Si vous souhaitez uniquement répercuter les films d'entrée une fois, vous pouvez utiliser une sous-requête: P> où code>: p>
avoir code> ne renvoie que des catégories qui ont Un film correspondant. P>
select category,
group_concat(case when has_movie then movie end) as movies,
( count(*) = sum(has_movie) ) as has_full_set
from (select m.*,
(m.movie in ( . . . )) as has_movie
from m
) m
group by category
having sum(has_movie) > 0;