par
sadeq » 08 janv. 2013, 11:32
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é
