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;
4 Réponses :
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;
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.
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
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);
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.
Est-il possible que l'instruction utilisée dans la condition WHERE doive être utilisée avec l'instruction HAVING à la place?