J'ai mis à niveau mon système et j'ai installé MySql 5.7.9 avec php pour une application Web sur laquelle je travaille. J'ai une requête qui est créée dynamiquement, et lorsqu'elle est exécutée dans les anciennes versions de MySql, cela fonctionne bien. Depuis la mise à niveau vers 5.7, j'obtiens cette erreur:
L'expression n ° 1 de la liste SELECT n'est pas dans la clause GROUP BY et contient la colonne non agrégée 'support_desk.mod_users_groups.group_id' qui ne dépend pas fonctionnellement des colonnes de la clause GROUP BY; cela est incompatible avec sql_mode = only_full_group_by
Notez la page de manuel de Mysql 5.7 sur le sujet des modes SQL du serveur .
C'est la requête qui me pose problème:
SELECT mod_users_groups.group_id AS 'value',
group_name AS 'text'
FROM mod_users_groups
LEFT JOIN mod_users_data ON mod_users_groups.group_id = mod_users_data.group_id
WHERE mod_users_groups.active = 1
AND mod_users_groups.department_id = 1
AND mod_users_groups.manage_work_orders = 1
AND group_name != 'root'
AND group_name != 'superuser'
GROUP BY group_name
HAVING COUNT(`user_id`) > 0
ORDER BY group_name
J'ai fait quelques recherches sur la question, mais je ne comprends pas only_full_group_by
assez pour comprendre ce que je dois faire pour résoudre la requête. Puis-je simplement désactiver l' only_full_group_by
option ou dois-je faire autre chose?
Faites-moi savoir si vous avez besoin de plus d'informations.
la source
not a GROUP BY expression
" C'est ça. Ils pourraient tout aussi bien avoir un code d'erreur numérique et aucun message.Réponses:
Je voudrais simplement ajouter
group_id
à laGROUP BY
.Lors d'
SELECT
une colonne qui ne fait pas partie de la,GROUP BY
il pourrait y avoir plusieurs valeurs pour cette colonne dans les groupes, mais il n'y aura de l'espace que pour une seule valeur dans les résultats. Ainsi, la base de données doit généralement être expliquée exactement comment transformer ces valeurs multiples en une seule valeur. Généralement, cela se fait avec une fonction d' agrégation commeCOUNT()
,SUM()
,MAX()
etc ... Je dis souvent parce que la plupart des autres systèmes de bases de données populaires insistent sur ce point . Cependant, dans MySQL avant la version 5.7, le comportement par défaut a été plus tolérant car il ne se plaindra pas et choisira alors arbitrairement n'importe quelle valeur ! Il a également unANY_VALUE()
fonction qui pourrait être utilisée comme une autre solution à cette question si vous aviez vraiment besoin du même comportement qu'auparavant. Cette flexibilité a un coût car elle n'est pas déterministe, donc je ne la recommanderais pas à moins d'avoir une très bonne raison d'en avoir besoin. MySQL active maintenant leonly_full_group_by
paramètre par défaut pour de bonnes raisons, il est donc préférable de s'y habituer et de rendre vos requêtes conformes.Alors pourquoi ma réponse simple ci-dessus? J'ai fait quelques hypothèses:
1) le
group_id
est unique. Cela semble raisonnable, c'est un «ID» après tout.2) le
group_name
est également unique. Ce n'est peut-être pas une hypothèse aussi raisonnable. Si ce n'est pas le cas et que vous en avez en doublegroup_names
et que vous suivez ensuite mon conseil pour l'ajoutergroup_id
àGROUP BY
, vous pouvez constater que vous obtenez désormais plus de résultats qu'auparavant car les groupes du même nom auront désormais des lignes distinctes dans les résultats. Pour moi, ce serait mieux que de cacher ces groupes en double car la base de données a discrètement sélectionné une valeur arbitrairement!Il est également recommandé de qualifier toutes les colonnes avec leur nom ou alias de table lorsque plusieurs tables sont impliquées ...
la source
GROUP BY
clause dans ma requête, mais je reçois cette erreur.Vous pouvez essayer de désactiver le
only_full_group_by
paramètre en exécutant ce qui suit:MySQL 8 n'accepte pas
NO_AUTO_CREATE_USER
ce qui doit être supprimé.la source
SELECT COUNT(*), t.* FROM my_table t GROUP BY col
et que vous avez 20 à 50 colonnes, voulez-vous passer autant de temps à ajouter chaque colonne à la par groupe?SELECT @@sql_mode;
puis en ajoutant le résultat de là à mon.cnf:sql_mode=[list of modes from query, minus ONLY_FULL_GROUP_BY]
vous pouvez désactiver le message d'avertissement comme expliqué dans les autres réponses ou vous pouvez comprendre ce qui se passe et y remédier.
Depuis MySQL 5.7.5, le mode SQL par défaut inclut ONLY_FULL_GROUP_BY, ce qui signifie que lorsque vous regroupez des lignes, puis sélectionnez quelque chose dans ces groupes, vous devez indiquer explicitement à partir de quelle ligne cette sélection doit être effectuée.
Mysql doit savoir quelle ligne du groupe vous recherchez, ce qui vous donne deux options
group by rect.color, rect.value
qui peut être celle que vous souhaitez dans certains cas, sinon retournerait des résultats en double avec la même couleur que vous ne souhaitez peut-être pas.AVG()
MIN()
MAX()
liste complèteANY_VALUE()
si vous êtes sûr que tous les résultats à l'intérieur du groupe sont les mêmes. docla source
FIRST()
méthode / fonction?ONLY_FULL_GROUP_BY
par défautSi vous ne souhaitez pas apporter de modifications à votre requête actuelle, suivez les étapes ci-dessous -
sudo vim /etc/mysql/my.cnf
A
pour entrer en mode d'insertionCopier et coller
Tapez
esc
pour quitter le mode d'entrée:wq
pour enregistrer et fermer vim.sudo service mysql restart
pour redémarrer MySQL.la source
paginate
fonction.my.cnf
fichier était/etc
. Les Als notent la nouvelle syntaxe depuisMySQL 5.7.8:
sql-mode="STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
Utilisez
ANY_VALUE()
pour faire référence à la colonne non agrégée.Depuis les documents MySQL 5.7 :
la source
ANY_VALUE
nulle part ailleurs dans des discussions similaires - fonctionne parfaitement pour moi avec monGROUP_BY
contains nonaggregated column
erreur.Je vais essayer de vous expliquer en quoi consiste cette erreur.
À partir de MySQL 5.7.5, l'option
ONLY_FULL_GROUP_BY
est activée par défaut.Ainsi, selon le standard SQL92 et versions antérieures:
(en savoir plus dans la documentation )
Ainsi, par exemple:
Vous obtiendrez un message d'erreur après avoir exécuté la requête ci-dessus.
Pourquoi?
Parce que MySQL ne comprend pas exactement quelles sont les valeurs des enregistrements groupés à récupérer, et c'est le point.
IE permet de dire que vous avez ces enregistrements dans votre
users
table:Et vous exécuterez une requête non valide indiquée ci-dessus.
Et vous obtiendrez l'erreur indiquée ci-dessus, car il y a 3 enregistrements avec un nom
John
et c'est bien, mais tous ont desemail
valeurs de champ différentes .Ainsi, MySQL ne comprend tout simplement pas lequel retourner dans l'enregistrement groupé résultant.
Vous pouvez résoudre ce problème en modifiant simplement votre requête comme suit:
En outre, vous voudrez peut-être ajouter plus de champs à la section SELECT, mais vous ne pouvez pas le faire, s'ils ne sont pas agrégés, mais qu'il y a une béquille que vous pourriez utiliser (mais fortement déconseillée):
Maintenant, vous pouvez vous demander pourquoi l'utilisation
ANY_VALUE
n'est pas fortement recommandée?Parce que MySQL ne sait pas exactement quelle valeur des enregistrements groupés récupérer, et en utilisant cette fonction, vous lui demandez de récupérer l'un d'eux (dans ce cas, l'e-mail du premier enregistrement avec nom = John a été récupéré).
Exactement, je ne peux pas trouver d'idées sur la raison pour laquelle vous voudriez que ce comportement existe.
S'il vous plaît, si vous ne me comprenez pas, en savoir plus sur le fonctionnement du regroupement dans MySQL, c'est très simple.
Et à la fin, voici une autre requête simple mais valide.
Si vous souhaitez interroger le nombre total d'utilisateurs en fonction des âges disponibles, vous pouvez noter cette requête
Ce qui est entièrement valide, selon les règles MySQL.
Etc.
Il est important de comprendre quel est exactement le problème et ensuite de noter la solution.
la source
GROUP BY DAY(created_date)
? Il semble que cela ne fonctionne pas siDAY()
est ajouté.J'utilise Laravel 5.3, mysql 5.7.12, sur laravel homestead (0.5.0, je crois)
Même après avoir explicitement défini l'édition
/etc/mysql/my.cnf
pour refléter:Je recevais toujours l'erreur.
Je devais changer
config/database.php
detrue
pourfalse
:Lectures complémentaires:
https://laracasts.com/discuss/channels/servers/set-set-sql-mode-on-homestead https://mattstauffer.co/blog/strict-mode-and-other-mysql-customizations-in-laravel -5-2
la source
Si vous utilisez wamp 3.0.6 ou toute version supérieure autre que la version stable 2.5, vous pourriez être confronté à ce problème, tout d'abord le problème est avec sql. vous devez nommer les champs en conséquence. mais il existe un autre moyen de le résoudre. cliquez sur l'icône verte du wamp. mysql-> paramètres mysql-> sql_mode-> aucun. ou à partir de la console, vous pouvez modifier les valeurs par défaut.
la source
show variables like '%sql_mode%';
dans la ligne de commande mysql, le paramètre sql_mode exposeraAjout de lignes (mention ci-dessous) dans le fichier: /etc/mysql/my.cnf
Fonctionne bien pour moi. Version du serveur: 5.7.18-0ubuntu0.16.04.1 - (Ubuntu)
la source
Accédez à mysql ou phpmyadmin et sélectionnez la base de données, puis exécutez simplement cette requête et cela fonctionnera. Cela fonctionne bien pour moi.
la source
Pour Mac:
1.Copiez le fichier my-default.cnf par défaut dans /etc/my.cnf
2.Changez sql_mode dans my.cnf à l'aide de votre éditeur préféré et réglez-le sur ce
3.Redémarrez le serveur MySQL.
la source
C'est ce qui m'a aidé à comprendre l'ensemble du problème:
Et dans ce qui suit un autre exemple de requête problématique.
Problématique:
Résolu en ajoutant ceci à la fin:
Remarque: Voir le message d'erreur en PHP, il vous indique où se situe le problème.
Exemple:
Dans ce cas, l' expression # 4 manquait dans le GROUP BY.
la source
Pour localhost / wampserver 3, nous pouvons définir sql-mode = user_mode pour supprimer cette erreur:
puis redémarrez wamp ou apache
la source
Vous pouvez ajouter un
unique index
àgroup_id
; si vous êtes sûr quegroup_id
c'est unique.Il peut résoudre votre cas sans modifier la requête .
Une réponse tardive, mais elle n'a pas encore été mentionnée dans les réponses. Peut-être devrait-il compléter les réponses déjà complètes disponibles. Au moins, cela a résolu mon cas lorsque j'ai dû diviser une table avec trop de champs.
la source
Si vous avez cette erreur avec Symfony en utilisant le générateur de requêtes de doctrine , et si cette erreur est causée par un orderBy :
Faites attention à
select
la colonne que vous souhaitezgroupBy
utiliser et utilisez à laaddGroupBy
place degroupBy
:Fonctionne sur Symfony3 -
la source
Toutes mes excuses pour ne pas utiliser votre SQL exact
J'ai utilisé cette requête pour surmonter l'avertissement Mysql.
noter la clé pour moi étant
la source