Introduction à SQL

Exemple requête corrélée MySQL

Exemple requête corrélée MySQL


La base de données qui sert d'exemple sur cette page contient 2 tables, une table plantes et une table fournisseurs. Les informations prix... ont été créees pour cet exemple.

Les tables Fournisseurs et Plantes
Highslide JS

Requête mysql_2010 d'affichage de l'article qui a le prix le plus élevé par fournisseur (avec aggrégation dans la requête principale)

Requête access_1010a d'affichage du prix moyen par article

SELECT fou.Nomfrs, pl.NomPlante, MAX(pl.PrixPlante AS PrixMax)
FROM w01_Fournisseurs AS fou, w01_Plantes AS pl
WHERE pl.Fournisseur=fou.CodeFrs
GROUP BY fou.Nomfrs;
Requête mysql_2010
Highslide JS
erreur requete serveur possible

Cette requête d'aggregation avec plusieurs champs dans le select peut générer une erreur selon la configuration du moteur de base de données MySQL v5.x.

Error Code: 1055. Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'db.fou.Nomfrs' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

Pour cette erreur, il s'agit du paramètre sql_mode=only_full_group_by

Cette erreur peut se produire sur le serveur MySql v5.x sous linux avec une installation par défault. Pour le moteur MySql v5.x avec la même version, pour un serveur sous Windows 7, il peut ne pas y avoir d'erreur pour cette requête. Parmi les solutions possibles, le plus simple est de modifier le serveur.

La configuration du serveur MySQL v5.x pour accepter les requêtes d'aggrégation avec plusieurs champs dans le SELECT peut être faite de la manière suivante:

SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));

Une autre solution est de modifier la requête pour écrire une écrire une requête corrélée. Voir ci-dessous (cette solution peut s'appliquer dans une situation où l'utilisateur n'a pas les privilèges pour modifier les paramètres du serveur)




Requête mysql_2011 d'affichage de l'article qui a le prix le plus élevé par fournisseur (avec requête corrélée)

SELECT fou.Nomfrs, pl.NomPlante, pl.PrixPlante AS PrixMax
FROM w01_Fournisseurs AS fou, w01_Plantes AS pl
WHERE pl.PrixPlante=(SELECT MAX(p.PrixPlante)
         FROM w01_Plantes p WHERE p.Fournisseur = fou.CodeFrs) 
AND pl.Fournisseur=fou.CodeFrs;
Requête mysql_2011
Highslide JS

Dernière mise à jour en mai 2021