Erreur liée à only_full_group_by lors de l'exécution d'une requête dans MySql

442

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_byassez pour comprendre ce que je dois faire pour résoudre la requête. Puis-je simplement désactiver l' only_full_group_byoption ou dois-je faire autre chose?

Faites-moi savoir si vous avez besoin de plus d'informations.

Dan Bemowski
la source
ici, j'ai trouvé la solution stackoverflow.com/a/7588442/612987
Wasim A.
21
Ce doit être le message d'erreur le plus compliqué que j'aie jamais rencontré.
Rolf
2
@Rolf Avez-vous vu l'erreur pour le même type de problème dans Oracle? " not a GROUP BY expression" C'est ça. Ils pourraient tout aussi bien avoir un code d'erreur numérique et aucun message.
Bill Karwin du

Réponses:

360

Je voudrais simplement ajouter group_idà la GROUP BY.

Lors d' SELECTune colonne qui ne fait pas partie de la, GROUP BYil 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 comme COUNT(), 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 le only_full_group_byparamè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_idest unique. Cela semble raisonnable, c'est un «ID» après tout.

2) le group_nameest é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 double group_nameset que vous suivez ensuite mon conseil pour l'ajouter group_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 ...

SELECT 
  g.group_id AS 'value', 
  g.group_name AS 'text' 
FROM mod_users_groups g
LEFT JOIN mod_users_data d ON g.group_id = d.group_id 
WHERE g.active = 1 
  AND g.department_id = 1 
  AND g.manage_work_orders = 1 
  AND g.group_name != 'root' 
  AND g.group_name != 'superuser' 
GROUP BY 
  g.group_name, 
  g.group_id 
HAVING COUNT(d.user_id) > 0 
ORDER BY g.group_name
davmos
la source
Merci, cela fonctionne parfaitement. J'accepte également de devoir qualifier les colonnes. Il élimine toute possibilité d'ambiguïté. Je suis en train de réparer le code maintenant. Merci un million pour l'aide.
Dan Bemowski
Je n'ai même pas de GROUP BYclause dans ma requête, mais je reçois cette erreur.
aitchkhan
@HaroonKhan, cela ressemble à une nouvelle question. Faites-moi savoir si vous le demandez et je vais jeter un oeil.
davmos
2
Dans MySQL 5.7, ils définissent une propriété qui requiert que tous les champs non agrégés d'une requête soient GROUP BY. Ainsi, une requête comme SELECT a, SUM (b) FROM table; signifie que le champ "a" doit être dans un GROUP BY. Donc, si vous n'avez pas de GROUP BY, vous devez l'ajouter à la requête. Il s'agit de savoir si vous avez au moins un champ agrégé dans la partie SELECT de votre requête.
user1567291
j'ai dû corriger «l'avertissement» en ajoutant l'élément à la clause group by comme suggéré dans cette réponse car aucune des réponses suggérant des corrections sql_mode n'a fonctionné. (mon MySQL était dans une procédure stockée mais je ne sais pas si cela était pertinent)
zzapper
355

Vous pouvez essayer de désactiver le only_full_group_byparamètre en exécutant ce qui suit:

mysql> set global sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
mysql> set session sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';

MySQL 8 n'accepte pas NO_AUTO_CREATE_USERce qui doit être supprimé.

WeiYuan
la source
85
Ceci est une solution de contournement, vous feriez mieux de corriger votre requête plutôt que de faire taire l'avertissement
azerafati
1
La mise à jour de /etc/mysql/my.cnf (comme illustré ci-dessous) est une solution plus durable car les paramètres par défaut ont tendance à revenir après le redémarrage. Et pour ceux qui disent que vous devez corriger la requête, alors ce n'est pas assez facile parfois lorsque vous avez besoin d'une requête de débogage rapide et faites des choses comme SELECT COUNT(*), t.* FROM my_table t GROUP BY colet que vous avez 20 à 50 colonnes, voulez-vous passer autant de temps à ajouter chaque colonne à la par groupe?
Shadoweb
3
Cette "solution" est assez dangereuse. Vous pouvez activer les modes que vous aviez désactivés auparavant en les changeant aveuglément au lieu de ne supprimer que l'indicateur de paramètres en question. Cela peut entraîner un comportement inattendu et, dans le pire des cas, conduire à des résultats incorrects ou empêcher votre application de fonctionner entièrement. Je considère donc cette réponse comme erronée.
Chris S.
1
J'ai rendu cela persistant grâce à l'actualisation en déterminant mon sql_mode actuel via 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]
wbharding
323

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

Mysql doit savoir quelle ligne du groupe vous recherchez, ce qui vous donne deux options

  • Vous pouvez également ajouter la colonne de votre choix à l'instruction de groupe, group by rect.color, rect.valuequi 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.
  • vous pouvez également utiliser les fonctions d'agrégation de mysql pour indiquer la ligne que vous recherchez dans les groupes comme la AVG() MIN() MAX() liste complète
  • ET enfin vous pouvez utiliser ANY_VALUE()si vous êtes sûr que tous les résultats à l'intérieur du groupe sont les mêmes. doc
azerafati
la source
25
Je ne pense pas que MySQL supporte la FIRST()méthode / fonction?
Ben Guild
3
Je crois que MySQL (au moins avant 5.7) par défaut prend la première valeur qu'il trouve dans un groupe. Il n'y a donc pas FIRST () car il était auparavant synonyme de la fonction GROUP BY elle-même.
DrDamnit
2
@DrDamnit, je crois que cela ressemblait plus à une sélection aléatoire dans de tels cas, ce qui a conduit à la confusion et donc à l'activation ONLY_FULL_GROUP_BYpar défaut
azerafati
6
Je connaissais déjà la réponse, mais l'exemple avec le rectangle coloré est si facile à comprendre que je vais le réutiliser la prochaine fois que quelqu'un me le demandera.
user327961
@azerafati est là quelque chose comme FIRST () ou une requête qui peut être utilisée pour obtenir la première valeur, comme c'est le cas avec moi.
Haris
169

Si vous ne souhaitez pas apporter de modifications à votre requête actuelle, suivez les étapes ci-dessous -

  1. vagabond ssh dans votre boîte
  2. Type: sudo vim /etc/mysql/my.cnf
  3. Faites défiler vers le bas du fichier et tapez Apour entrer en mode d'insertion
  4. Copier et coller

    [mysqld]
    sql_mode = STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
  5. Tapez escpour quitter le mode d'entrée

  6. Tapez :wqpour enregistrer et fermer vim.
  7. Tapez sudo service mysql restartpour redémarrer MySQL.
Ajai
la source
Juste un avertissement à tous les utilisateurs de Vagrant essayant de l'utiliser avec AdonisJS, vous en avez besoin pour exécuter la paginatefonction.
Michael J.Calkins
Ce n'est évidemment pas seulement pour les utilisateurs de Vagrant, mais pour tout système Unix. Notez que pour moi, l'emplacement du my.cnffichier é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"
Valentin Grégoire
Fonctionne pour moi dans Mint 19.3 (Ubuntu 18.04) Merci
Marco López
71

Utilisez ANY_VALUE()pour faire référence à la colonne non agrégée.

SELECT name,           address , MAX(age) FROM t GROUP BY name; -- fails
SELECT name, ANY_VALUE(address), MAX(age) FROM t GROUP BY name; -- works

Depuis les documents MySQL 5.7 :

Vous pouvez obtenir le même effet sans désactiver ONLY_FULL_GROUP_BY en utilisant ANY_VALUE()pour faire référence à la colonne non agrégée.

...

Cette requête peut être invalide avec ONLY_FULL_GROUP_BYactivé car la colonne d'adresse non agrégée dans la liste de sélection n'est pas nommée dans la GROUP BYclause:

SELECT name, address, MAX(age) FROM t GROUP BY name;

...

Si vous savez que, pour un ensemble de données donné, chaque valeur de nom détermine en fait de manière unique la valeur d'adresse, l'adresse dépend effectivement du nom. Pour dire à MySQL d'accepter la requête, vous pouvez utiliser la ANY_VALUE()fonction:

SELECT name, ANY_VALUE(address), MAX(age) FROM t GROUP BY name;
Italo Borssatto
la source
1
En tant que personne qui rencontrait ce problème depuis un certain temps maintenant - j'aime particulièrement cette solution car elle ne nécessite pas de modifier des fichiers ou des paramètres dans votre configuration MySQL. Il est intéressant de noter que je ne le vois ANY_VALUE nulle part ailleurs dans des discussions similaires - fonctionne parfaitement pour moi avec mon GROUP_BY contains nonaggregated columnerreur.
adstwlearn
50

Je vais essayer de vous expliquer en quoi consiste cette erreur.
À partir de MySQL 5.7.5, l'option ONLY_FULL_GROUP_BYest activée par défaut.
Ainsi, selon le standard SQL92 et versions antérieures:

n'autorise pas les requêtes pour lesquelles la liste de sélection, la condition HAVING ou la liste ORDER BY font référence à des colonnes non agrégées qui ne sont ni nommées dans la clause GROUP BY ni dépendantes de manière fonctionnelle (uniquement déterminée par) des colonnes GROUP BY

(en savoir plus dans la documentation )

Ainsi, par exemple:

SELECT * FROM `users` GROUP BY `name`;

Vous obtiendrez un message d'erreur après avoir exécuté la requête ci-dessus.

# 1055 - L'expression # 1 de la liste SELECT n'est pas dans la clause GROUP BY et contient la colonne non agrégée 'testsite.user.id' qui ne dépend pas fonctionnellement des colonnes de la clause GROUP BY; cela est incompatible avec sql_mode = only_full_group_by

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 userstable:
Yo

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 Johnet c'est bien, mais tous ont des emailvaleurs 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:

SELECT `name` FROM `users` GROUP BY `name`

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):

SELECT ANY_VALUE(`id`), ANY_VALUE(`email`), `name` FROM `users` GROUP BY `name`

entrez la description de l'image ici

Maintenant, vous pouvez vous demander pourquoi l'utilisation ANY_VALUEn'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

SELECT `age`, COUNT(`age`) FROM `users` GROUP BY `age`;

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.

Abraham Tugalov
la source
Merci pour cette belle réponse. Que se passe-t-il si je veux également les e-mails, sous forme de tableau dans le groupe de résultats?
Josiah
1
Vous pouvez toujours GROUP_CONCAT champ obligatoire pour obtenir chaque entrée.
Abraham Tugalov
Oh! donc il y a un moyen! S'il vous plaît, aidez-moi dans cette question
Josiah
Merci pour cette excellente réponse. Et si je veux faire GROUP BY DAY(created_date)? Il semble que cela ne fonctionne pas si DAY()est ajouté.
eskimo
41

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.cnfpour refléter:

[mysqld]
sql_mode = STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

Je recevais toujours l'erreur.

Je devais changer config/database.phpde truepour false:

    'mysql' => [
        'strict' => false, //behave like 5.6
        //'strict' => true //behave like 5.7
    ], 

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

Ryan
la source
Dang! Cela a été utile pour les utilisateurs de Laravel. +1 pour cela.
Okafor T Kosiso
20

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.

mysql> set global sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
mysql> set session sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
PiyaChakraborty
la source
fantastique, s'appuyant sur ce qu'il a dit, insérer une commande show variables like '%sql_mode%';dans la ligne de commande mysql, le paramètre sql_mode exposera
Jade Han
19

Ajout de lignes (mention ci-dessous) dans le fichier: /etc/mysql/my.cnf

[mysqld]
sql_mode = STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

Fonctionne bien pour moi. Version du serveur: 5.7.18-0ubuntu0.16.04.1 - (Ubuntu)

Jagdeep Singh
la source
1
utilisez-vous RDS?
Mubasshir Pawle
@MubasshirPawle No
Jagdeep Singh
16

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.

SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
Anil Gupta
la source
Great..Thank :)
mohitesachin217
Mon plaisir :) @mohit
Anil Gupta
M'a sauvé une tonne de temps, merci.
JoeRaid
1
Bienvenue bro @TharinduEranga
Anil Gupta
1
Mais le problème avec la solution est chaque fois que je redémarre mysql, je dois réexécuter la requête. Cela signifie que la solution n'est pas permanente ou persistante.
Mushfiqur Rahman le
10

Pour Mac:

1.Copiez le fichier my-default.cnf par défaut dans /etc/my.cnf

sudo cp $(brew --prefix mysql)/support-files/my-default.cnf /etc/my.cnf

2.Changez sql_mode dans my.cnf à l'aide de votre éditeur préféré et réglez-le sur ce

sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

3.Redémarrez le serveur MySQL.

mysql.server restart
Tanvir Hasan Anick
la source
Merci, ça a aussi fonctionné pour moi. Mais j'utilise mysql par défaut de Mac, donc je n'ai pas de chemin de brassage. Juste sudo cp my-default.cnf /etc/my.cnf
Mike Nguyen
2
@Mike Nguyen sudo cp /usr/local/mysql-5.7.17-macos10.12-x86_64/support-files/my-default.cnf /etc/my.cnf sudo vi /etc/my.cnf set sql_model sql_mode = STRICT_TRANS_TABLES , NO_ZERO_IN_DATE, NO_ZERO_DATE, ERROR_FOR_DIVISION_BY_ZERO, NO_AUTO_CREATE_USER, NO_ENGINE_SUBSTITUTION Redémarrez le serveur MySQL.
Yong Gao
7

C'est ce qui m'a aidé à comprendre l'ensemble du problème:

  1. https://stackoverflow.com/a/20074634/1066234
  2. https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html

Et dans ce qui suit un autre exemple de requête problématique.

Problématique:

SELECT COUNT(*) as attempts, SUM(elapsed) as elapsedtotal, userid, timestamp, questionid, answerid, SUM(correct) as correct, elapsed, ipaddress FROM `gameplay`
                        WHERE timestamp >= DATE_SUB(NOW(), INTERVAL 1 DAY)
                        AND cookieid = #

Résolu en ajoutant ceci à la fin:

  GROUP BY timestamp, userid, cookieid, questionid, answerid, elapsed, ipaddress

Remarque: Voir le message d'erreur en PHP, il vous indique où se situe le problème.

Exemple:

Erreur de requête MySQL 1140: dans une requête agrégée sans GROUP BY, l'expression # 4 de la liste SELECT contient la colonne non agrégée 'db.gameplay.timestamp'; ceci est incompatible avec sql_mode = only_full_group_by - Requête: SELECT COUNT (*) as tentatives, SUM (elapsed) as elapsedtotal, userid, timestamp, questionid, answerid, SUM (correct) as correct, elapsed, ipaddress FROM gameplay WHERE timestamp> = DATE_SUB (MAINTENANT (), INTERVAL 1 JOUR) ET userid = 1

Dans ce cas, l' expression # 4 manquait dans le GROUP BY.

Kai Noack
la source
1
Merci d'avoir signalé stackoverflow.com/questions/20074562/…
cwhsu
Excellente réponse pour résoudre ce problème. Merci beaucoup
Hansana Athukorala
7

Pour localhost / wampserver 3, nous pouvons définir sql-mode = user_mode pour supprimer cette erreur:

click on wamp icon -> MySql -> MySql Setting -> sql-mode -> user_mode

puis redémarrez wamp ou apache

Braham Dev Yadav
la source
1
Je sais que ce n'est peut-être pas une solution à long terme pour ce problème, mais cela a certainement aidé pour l'instant. Ma société d'hébergement, Go Daddy, utilise MySQL V5.6.33 et WampServer 3 utilise MySQL V5.7.14. Merci pour cette solution miracle
Alan N
4

Vous pouvez ajouter un unique indexà group_id; si vous êtes sûr que group_idc'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.

micaball
la source
2

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 à selectla colonne que vous souhaitez groupByutiliser et utilisez à la addGroupByplace de groupBy:

$query = $this->createQueryBuilder('smth')->addGroupBy('smth.mycolumn');

Fonctionne sur Symfony3 -

Gangai Johann
la source
1

Toutes mes excuses pour ne pas utiliser votre SQL exact

J'ai utilisé cette requête pour surmonter l'avertissement Mysql.

SELECT count(*) AS cnt, `regions_id`
FROM regionables 
WHERE `regionable_id` = '115' OR `regionable_id` = '714'
GROUP BY `regions_id`
HAVING cnt > 1

noter la clé pour moi étant

count(*) AS cnt
Harry Bosh
la source