J'ai une table mon SQL est le suivant: p> users_movies code> comme ceci:
Movie | plus | minus
------+------+------
1 | 45 | 55
2 | 45 | 55
3 | 45 | 55
etc.
3 Réponses :
Votre requête d'origine mélange l'agrégation et les sous-couches qui ne semblent pas correctement corrélées.
Vous pouvez le simplifier avec une agrégation conditionnelle: p> ceci fonctionne car Si les valeurs sont d'autres 0 et 1, la technique est une autre: P> se classe code> est 0 ou 1, donc
somme (grades) code> vous donne le numéro d'enregistrements dans lequel
rang = 1 code> et
comptent (*) - Somme (*) - rangs) code> vous donne le nombre de 0s. p>
create view v1 as
select
movie_id,
sum(case when ranks = 'good' then 1 else 0 end) good,
sum(case when ranks = 'bad' then 1 else 0 end) bad
from users_movies
group by movie_id
Oh, il semble que j'étais en retard avec ma réponse :-)
Je ne sais pas exactement ce qui se passe. Deux choses que je vois:
film code> dans la clause SELECT. Vous ne devriez pas pouvoir utiliser cet alias dans la même clause de sélection, car il n'y a pas d'ordre dans lequel les parties de la clause SELECT doivent être évoquées. LI>
- Dans les sous-requêtes, vous utilisez l'ID de film de la requête principale. Il n'y a pas d'agrégation sur le résultat de la sous-requête (tel que
min code>, somme code> ou similaire), il faut donc être l'identifiant de film unique après l'agrégation de la requête principale. Ou est-ce mysql? Ensuite, cela devient criminel, car MySQL permet d'omettre la fonction d'agrégation. Néanmoins, même cela n'explique pas différents résultats. Li>
ul> Après tout, vous voulez seulement ceci: p> xxx pré> p>
Si vous avez aliasé la table et que vous avez utilisé des noms de colonne qualifiés à l'intérieur des sous-candidats corrélés, vous obtiendrez des résultats corrects:
CREATE VIEW v1 AS SELECT movie_id, SUM(ranks = 1) plus, SUM(ranks = 0) minus FROM users_movies GROUP BY movie_id;