1
votes

Erreur GROUP BY lors de l'utilisation d'un opérateur Count () dans la clause WHERE

J'obtiens un Code d'erreur 1111. Utilisation non valide de la fonction de groupe lors de l'utilisation d'un opérateur Count () dans la condition where. Je pense que le problème est que je ne suis pas autorisé à utiliser des opérateurs de comptage dans la clause WHERE, mais je ne sais pas comment obtenir le nombre de lignes dans une condition utilisable.

Le but de la requête est de sélectionner des champs où le sujet a vu plus d'un film. L'astuce est que subject_id est une clé composite avec movie_id. Je rencontre des problèmes pour filtrer les lignes où le sujet n'a vu qu'un seul film.

Requête:

Subject_id     Movie_id     Variation
001            1            45
001            35           15   
003            1            4
003            2            5

Résultat:

Subject_id     Movie_id     Variation
001            1            45
001            35           15
002            42           2        
003            1            4
003            2            5

Résultats attendus:

SELECT 
    measures.Subject_id, 
    measures.Movie_id, 
    measures.Median_heart_rate AS Variation 
FROM measures 
WHERE COUNT(measures.Subject_id) > 1;


1 commentaires

Est-il possible que l'instruction utilisée dans la condition WHERE doive être utilisée avec l'instruction HAVING à la place?


4 Réponses :


1
votes

COUNT doit figurer dans la clause SELECT et non dans la clause WHERE.
Pour filtrer les lignes subject_id non répétitives, une requête interne avec COUNT peut être utilisée:

SELECT `subject_id`, 
       `movie_id`, 
       `median_heart_rate` AS Variation 
FROM   `measures` m1
WHERE  (SELECT Count(1) 
        FROM   `measures` m2
        WHERE  m2.`subject_id` = m1.`subject_id`) > 1; 


2 commentaires

Malheureusement, cela ne fonctionnera pas, DISTINCT donnera une liste de quatre valeurs, qui seront alors comptées pour quatre, ce qui signifie que l'instruction sera toujours TRUE


@KingAfrica J'ai modifié ma réponse pour résoudre ce problème. Vérifiez s'il vous plaît.



0
votes

Dans MySQL 8.0, vous pouvez utiliser la fonction de fenêtre COUNT (...) OVER (...) pour vérifier combien de films chaque utilisateur a vu. Ensuite, la requête externe filtre simplement les enregistrements en fonction de cette valeur:

SELECT *
FROM (
    SELECT 
        Subject_id, 
        Movie_id, 
        Variation,
        COUNT(*) OVER (PARTITION BY Subject_id) cnt
    FROM measures
) x
WHERE cnt > 1


0 commentaires

0
votes

La solution s'est retrouvée comme telle:

SELECT measures.Subject_id, measures.Movie_id, measures.Median_heart_rate AS Variation 
FROM measures 
WHERE measures.Subject_id IN (SELECT  DISTINCT Subject_id FROM measures GROUP BY Subject_id HAVING COUNT(Subject_id) > 1);


0 commentaires

0
votes

J'utiliserais simplement exists:

SELECT m.Subject_id, m.Movie_id, 
       m.Median_heart_rate AS Variation 
FROM measures m
WHERE EXISTS (SELECT 1
              FROM measures m2
              WHERE m2.Subject_id = m.Subject_id AND
                    m2.Movie_id <> m.Movie_id
             );

Si votre clé primaire est en effet mesures (Subject_id, Movie_id) , alors cela devrait ont également de très bonnes performances.


0 commentaires