GROUP BY avec MySQL 5.7

Avatar du membre
Eléphant du PHP | 224 Messages

28 janv. 2019, 07:48

Hello,

Je suis en train de passer un site en PHP7 et pour le tester, je me suis monté un serveur virtuel avec :
Ubuntu 18.04 Server
Apache 2.4.29
PHP 7.2.10-0
MySQL 5.7.25-0

Et je bute plus que royalement sur un problème qu'est en train de me rendre fou (et à en suivre les résultat de mes recherches sur le net, je ne suis pas le seul) : GROUP BY

J'ai une de type SELECT avec 2 ou 3 tables jointes, ca marchait avant (lol), mais sur ce serveur , niet.
#1055 - Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'dbe90.vote_semainetmp.artist' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
Très bien le me dit que ma requête est un peu fouillis, que certaines colonnes sont en double ou triple donc j'épure, j'épure , j'épure, mais toujours pareil (hormis le nom de colonne qui diffère) ...
Je vais jusqu'à en réduire à une des plus simples requêtes :

Code : Tout sélectionner

SELECT * FROM vote_semainetmp GROUP BY artist
Bah non, impossible !
#1055 - Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'dbe90.vote_semainetmp.id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
Qu'est-ce que c'est qu'c'te blague ?!
Je ne comprends pas le sens du message d'erreur (que ce soit en anglais ou si je traduis), encore moins les explications qu'on peut trouver par ci par là, encore moins quel requête je dois faire pour que ça marche (au pire je peux toujours modifier le sql_mode mais bon ...).

Merci pour votre aide :)
Couiinnn
Un Couin vaut mieux que Deux tu couineras :D
Retrouvez-moi tous les dimanches soir à 22H pour un mix live au vinyle sur eurodance90.fr :mrgreen:

Mammouth du PHP | 1967 Messages

28 janv. 2019, 09:24

Il faut que tu nous précise la raison de ton group by, y a t il un count, sum, max, ... dans ton select ?
sinon, quelle utilité a t il ?

Dans tous les cas, la clause group by doit comprendre tous les champs qui sont dans ton select sauf ceux qui sont utilisé dans des fonctions de stat (comme celle cité pluas haut).

l'autre solution mais je la sconseille pas est de modifier le paramètre sql_mode mais cela n'est pas possible dans tous les environements.
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone du rubik's cube

Avatar du membre
Eléphant du PHP | 224 Messages

28 janv. 2019, 15:27

Salut Spol,

Merci pour ta réponse rapide :)
Dans tous les cas, la clause group by doit comprendre tous les champs qui sont dans ton select sauf ceux qui sont utilisé dans des fonctions de stat (comme celle cité pluas haut).
Je crois que cette explication est bien plus simple que tout ce que j'ai pu lire !

En effet, j'ai fais quelques essais (simples) concluants.
Je vais devoir repenser quelques requêtes masi ca va il n'y en a pas beaucoup de ce type.

Je passe en R2solu pour le moment :)

Merci
Un Couin vaut mieux que Deux tu couineras :D
Retrouvez-moi tous les dimanches soir à 22H pour un mix live au vinyle sur eurodance90.fr :mrgreen:

Avatar du membre
Eléphant du PHP | 224 Messages

02 déc. 2021, 01:32

Coucou,

je sors la pelleteuse car je suis à nouveau confronté à ce problème mais pour ORDER BY et je ne m'en sors pas :(
Une table inj_eqpt dans la base chronostats, comme ceci :

Code : Tout sélectionner

eqpt_id eqpt_name eqpt_color 1 SB01-IUB01 8204FF 2 SB01-IUB02 8204FF 3 SB01-IUB03 8204FF 4 SB01-IUB04 8204FF 5 SB01-IUB05 82B4FF 6 SB01-IUB06 82B4FF 7 SB01-IUB07 82B4FF 8 SH01-IUH01 FF03B4 9 SH01-IUH02 FF03B4 10 SH01-IUH03 FF03B4 11 SH01-IUH05 FFE3B4 12 SH01-IUH06 FFE3B4 13 SH01-IUH07 FFE3B4 14 SH01-IUH08 FFE3B4
La requête sur mon ancien serveur (MySQL 5.5.22) :

Code : Tout sélectionner

SELECT eqpt_color FROM inj_eqpt GROUP BY eqpt_color ORDER BY eqpt_id ASC
J'obtiens les 4 codes couleurs, dans l'ordre des ID d'équipement :

Code : Tout sélectionner

82B4FF 8204FF FF03B4 FFE3B4

Mais sur MySQL 5.7.36, même en lui demandant gentillement, j'ai droit à la belle insulte :
#1055 - Expression #1 of ORDER BY clause is not in GROUP BY clause and contains nonaggregated column 'chronostats.inj_eqpt.eqpt_id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

Si j'en suis la réponse (qui m'avait pourtant bien aidé) de Spols, et que j'applique à ORDER BY, je tente un :

Code : Tout sélectionner

SELECT eqpt_color FROM inj_eqpt GROUP BY eqpt_color ORDER BY eqpt_color ASC
Plus d'insulte mais les résultats ne sont pas dans l'ordre souhaité :
8204FF
82B4FF
FF03B4
FFE3B4
Comment puis-je reproduire le résultat obtenu dans MySQL 5.5 , avec MySL 5.7 , sans devoir désactiver ONLY_FULL_GROUP_BY dans la variable sql_mode de PhpMyAdmin ?

Merkouiiiiinnnn :D
Un Couin vaut mieux que Deux tu couineras :D
Retrouvez-moi tous les dimanches soir à 22H pour un mix live au vinyle sur eurodance90.fr :mrgreen: