Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème avec le group_by depuis le maj de MySQL

30 avril 2017 à 21:26:00

Hello,
 
J'avais un site e-commerce que j'avais fait pour un examen de code qui regroupé SQL,PHP, JS, ... mais depuis je suis devenu front et j'ai complètement oublié le fonctionnement des requêtes.
 
J'ai relancé ce site et j'obtiens ces erreurs là :  
 
Erreur sur la requête SQL.
Message : Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'hus.article.id_article' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
Code : SELECT * FROM article WHERE categorie LIKE '%lampe%' GROUP BY categorie ORDER BY id_article DESC
 
ou encore  
 
Erreur sur la requête SQL.
Message : Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'hus.av.note' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
Code : SELECT ar.id_article, note, categorie, titre, prix, photo, id_promo FROM article ar LEFT JOIN avis av ON ar.id_article = av.id_article GROUP BY ar.id_article ORDER BY ar.id_article DESC LIMIT 0,16
 
Avant je n'avais pas de problème, peut-on m'aider ? Je sais que le soucis vient du group by mais je ne sais plus du tout comment faire cette requête proprement.
 
Si je pouvais avoir un exemple avec l'une de mes requêtes, je suis plutôt du genre à comprendre avec du concret qu'avec des explications :D

merci pour votre aide :)

-
Edité par WebChris68 30 avril 2017 à 21:26:20

  • Partager sur Facebook
  • Partager sur Twitter
Hacker de Kinder
2 mai 2017 à 10:01:06

Bonjour,

L'erreur retournée est due à l'option sql_mode=only_full_group_by.

Avant MySQL 5.7, par défaut, MySQL autorisait de ne pas avoir les mêmes colonnes au SELECT et au GROUP BY, ce qui était un peu étrange mais bon ... Depuis la 5.7 le sql_mode contient l'option only_full_group_by par défaut qui permet de refuser ce comportement et de se raccrocher aux comportements des autres SGBDR.

Un peu de lecture si cela t'intéresse : http://cedric-duprez.developpez.com/tutoriels/mysql/demythifier-group-by/

Du coup pour corriger ces erreurs ... Première solution changer la valeur de l'option sql_mode.

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

Sinon, je te conseille de reprendre tes requêtes utilisant GROUP BY pour respecter les colonnes nécessaires.

Dans la première :

SELECT *
FROM article
WHERE categorie
LIKE '%lampe%'
GROUP BY categorie
ORDER BY id_article DESC

Je ne vois pas l'intérêt du GROUP BY puisqu'il n'y a pas de fonction d'agrégat (COUNT, SUM, MIN, MAX, etc.). A quoi devait servir cette requête ? Si c'est simplement la liste des articles de la catégorie lampe, alors retires le GROUP BY complètement ...

Dans la deuxième :

SELECT ar.id_article, note, categorie, titre, prix, photo, id_promo
FROM
	article ar
		LEFT JOIN avis av
			ON ar.id_article = av.id_article
GROUP BY ar.id_article
ORDER BY ar.id_article DESC
LIMIT 0,16

Idem que pour la première, le GROUP BY semble inutile ...

  • Partager sur Facebook
  • Partager sur Twitter
Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
19 mars 2020 à 23:10:59

1
SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
  • Partager sur Facebook
  • Partager sur Twitter

ABDESSEMED

19 mars 2020 à 23:22:29

Déterrage complètement inutile au vu des autres messages ...

Je ferme.

  • Partager sur Facebook
  • Partager sur Twitter
Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL