-1
votes

Vue SQL - Résultat différent de Select

J'ai une table users_movies code> comme ceci: xxx pré>

mon SQL est le suivant: p>

Movie | plus | minus
------+------+------
  1   |  45  |  55
  2   |  45  |  55
  3   |  45  |  55
  etc.


0 commentaires

3 Réponses :


2
votes

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> xxx pré>

ceci fonctionne car 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>

Si les valeurs sont d'autres 0 et 1, la technique est une autre: 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


1 commentaires

Oh, il semble que j'étais en retard avec ma réponse :-)



0
votes

Je ne sais pas exactement ce qui se passe. Deux choses que je vois:

  • Vous créez un alias film 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.
  • 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 , somme 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.

    Après tout, vous voulez seulement ceci: xxx


0 commentaires

3
votes

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;


0 commentaires