Page 1 sur 1

Requete mysql

Posté : 07 janv. 2013, 19:56
par THBT
Bonjour,

Dans le cadre d'un projet, je dois écrire certaines requêtes. Je bloque pour une, j'arrive presque au résultat.

Avec la requete suivante :
SELECT nomgroupe, nomGenre, COUNT(nomGenre)
FROM possede, regroupe
WHERE possede.numChanson=regroupe.numChanson
GROUP BY nomGroupe, nomGenre
ORDER BY nomGroupe, COUNT(nomGenre) DESC
J'obtiens les résultats suivants :

nomgroupe nomGenre COUNT(nomGenre)
AC/DC Hard Rock 15
Buckcherry Alternative Rock 36
Buckcherry Hard Rock 36
Buckcherry Alternative 36
Buckcherry Rock 36
Buckcherry Grunge 36
Buckcherry Glam Rock 14
Buckcherry Classic Rock 3
Buckcherry Punk Rock 2
Buckcherry Dance 2
Buckcherry Guitar 1
Buckcherry Pop Rock 1
Buckcherry Hardcore 1
Buckcherry Ska Punk 1
Buckcherry Heavy Metal 1
Buckcherry Indie Rock 1
Caravan Palace Electronic 7
Drive Like Jehu Post Hardcore 12
Eddie Vedder OST/Rock 11
Evergrey Progressive Metal 39
Extreme Hard Rock 14
Extreme Funk Rock 14
Extreme Rock 14
Extreme Funk Metal 13
Extreme Metal 11
Extreme Glam Rock 7
Extreme Blues 3
Extreme Progressive Rock 3
Extreme Alternative 3

J'aimerais récupérer seulement le genre avec le score le plus elevé pour chaque groupe. Comment faire ?

Re: Requete mysql

Posté : 08 janv. 2013, 11:32
par sadeq
Bonjour et bonne année;

Pour résoudre le problème il faut passer par deux phases de calcul :
1. Compter les genres par groupe
2. Sélectionner par groupe le compte de genres (de l'étape 1) égal au maximum de ses comptes (trouvés dans l'étape 1)

Voici donc la résolution en 2 étapes avec une seule requête contenant une sous-requête. La requête principale effectue l'étape n°2 et la sous-requête effectue l'étape n°1. Et pour que la requête principale attende le résultat de la sous-requête on va imbriquer cette dernière dans la clause FROM de la requête principale. Donc la sous-requête (représentant l'étape 1) servira comme une table dynamique source pour la requête principale (représentant l'étape 2)

Voici la sous-requête (représentant l'étape 1):
SELECT nomgroupe, nomGenre, COUNT(nomGenre)  as compte_Genre
FROM possede, regroupe
WHERE possede.numChanson=regroupe.numChanson
GROUP BY nomGroupe, nomGenre
ORDER BY nomGroupe, nomGenre, COUNT(nomGenre)  DESC
Exactement comme ta requête actuelle. J'ai donné l'alias "compte_Genre" au champ calculé : COUNT(nomGenre) car on va le réutiliser dans la requête principale qui ouvrira celle-ci dans la clause FROM.

Voici la requête principale (représentant l'étape 2):
SELECT req1.nomgroupe, req1.nomGenre, req1.compte_Genre
FROM  (imbriquer ici la sous-requête représentant l'étape 1) req1
GROUP BY req1.nomGroupe HAVING MAX(req1.compte_Genre) = req1.compte_Genre
ORDER BY req1.nomGroupe, req1.compte_Genre DESC
La sous-requête doit être insérée à l'emplacement indiqué dans la clause FROM et aura un alias "req1"
Elle regroupe les enregistrements par nomGroupe pour éliminer le détail des genres et ne sélectionne que les compte_Genre équivalent à leur Max. (GROUP BY req1.nomGroupe HAVING MAX(req1.compte_Genre) = req1.compte_Genre)

Et voici donc la requête finale :
SELECT req1.nomgroupe, req1.nomGenre, req1.compte_Genre
FROM (

     SELECT nomgroupe, nomGenre, COUNT(nomGenre)  as compte_Genre
     FROM possede, regroupe
     WHERE possede.numChanson=regroupe.numChanson
     GROUP BY nomGroupe, nomGenre
     ORDER BY nomGroupe, nomGenre, COUNT(nomGenre)  DESC

) req1
GROUP BY req1.nomGroupe HAVING MAX(req1.compte_Genre) = req1.compte_Genre
ORDER BY req1.nomGroupe, req1.compte_Genre DESC
J'espère avoir aidé :wink:

Re: Requete mysql

Posté : 08 janv. 2013, 17:59
par THBT
C'est le cas !
Un énorme merci !

THBT.