web-dev-qa-db-fra.com

SQLSTATE [42000]: Erreur de syntaxe ou violation d'accès: 1055 L'expression n ° 3 de la liste SELECT n'est pas dans la clause GROUP BY et contient des données non agrégées.

quand je me suis amélioré mon ubuntu du 15.10 au 16.04 j'ai cet erro dans mon projet yii2

SQLSTATE[42000]: Syntax error or access violation: 1055 Expression #3
of SELECT list is not in GROUP BY clause and contains nonaggregated column 
'iicityYii.opportunity_conditions.money' which is not functionally dependent 
on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

Le SQL en cours d'exécution était:

SELECT SUM(oc.money),op.id,oc.money,
            op.mantaghe,
            op.`time`, op.`id`, `op`.`logo`,
           `pd`.`user_id`, `op`.`name`, 
           `pd`.`co_name`, `op`.`address`, 
           `op`.`project_type_id`, `op`.`state_id`
FROM `opportunity` op 
INNER JOIN `profile_details` pd  ON op.user_id=pd.user_id  
INNER JOIN `opportunity_conditions` oc ON   op.id=oc.opportunity_id
GROUP BY `op`.`id`
ORDER BY `op`.`id` DESC

comment résoudre mon problème? 

19
Saltern

Dans votre sélection, vous avez une somme de fonctions agrégée et un ensemble de noms de colonnes. L'erreur vous indique que vous n'avez pas spécifié la liste correcte des noms de colonnes dans la clause group by. peut-être devriez-vous ajouter plus de colonnes name dans group par probablement lié à la table profile_details, opportunity_conditions 

Vous avez également ,(opportunity.id),(opportunity_conditions.money), (opportunity.mantaghe), pourquoi le () si vous avez besoin de sum, vous devez ajouter sum à toutes les colonnes 

sum(opportunity.id), sum(opportunity_conditions.money),

somme (opportunité.mantaghe),

sinon, si ce sont des colonnes normales, vous devriez utiliser le sintax normal without ()

opportunity.id, opportunity_conditions.money,opportunity.mantaghe,

J'ai essayé de réécrire une requête possible 

 SELECT SUM(opportunity_conditions.money),
        `opportunity`.`id`,
        `opportunity_conditions.money`,
        `opportunity.mantaghe`, 
        `opportunity`.`time`, 
        `opportunity`.`logo`, 
        `profile_details`.`user_id`,
        `opportunity`.`name`, 
        `profile_details`.`co_name`,
        `opportunity`.`address`, 
        `opportunity`.`project_type_id`,
        `opportunity`.`state_id` 
FROM `opportunity` 
INNER JOIN `profile_details` ON `opportunity`.`user_id`= `profile_details`.`user_id` 7
INNER JOIN `opportunity_conditions` ON `opportunity`.`id`=`opportunity_conditions`.`opportunity_id` 
GROUP BY`opportunity`.`id`,   `profile_details`.`user_id`,`opportunity_conditions.money`,  
ORDER BY `opportunity`.`id` DESC

avec group by sur le nom de colonne essentiel (j'espère)

GROUP BY`opportunity`.`id`,   `profile_details`.`user_id`,`opportunity_conditions.money`,  
7
scaisEdge

Exécutez le:

Sudo mysql -u root -p

Et changez le mode SQL pour votre instance de serveur MySQL:

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

Une autre façon serait d'utiliser les configurations de MySQL. Allez à /etc/mysql/my.cnf:

  • ajoutez une section pour [mysqld] et juste en dessous ajoutez la déclaration sql_mode = ""
  • redémarrez le service mysql:

    Sudo systemctl restart mysql
    
50
chitwarnold

Dans laravel avec MySql, allez dans le fichier config/database.php et changez le tableau dans le mode MySql strict en false.

'connections' => [
    'mysql' => [
        'driver' => 'mysql',
        'Host' => env('DB_Host', '127.0.0.1'),
        'port' => env('DB_PORT', '3306'),
        'database' => env('DB_DATABASE', 'forge'),
        'username' => env('DB_USERNAME', 'forge'),
        'password' => env('DB_PASSWORD', ''),
        'unix_socket' => env('DB_SOCKET', ''),
        'charset' => 'utf8mb4',
        'collation' => 'utf8mb4_unicode_ci',
        'prefix' => '',
        'strict' => false, //from true
        'engine' => null,
    ],
],
7
caicedo1089

Veuillez simplement copier cette ligne et l'exécuter. cela a fonctionné pour moi. 

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

La solution est d'éditer le fichier de configuration MySQL car la configuration sera rétablie après chaque redémarrage ...

Sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf

et ajouter

[mysqld]
sql-mode=""

puis redémarrer

Sudo systemctl restart mysql

Fonctionne sur Ubuntu 18.04.

1
resizemyimg.com

Thx, cela m'a aidé, mais cela ne le réglera pasDE MANIÈRE PERMANENTE, et il reviendra après chaque redémarrage.

Vous devriez donc le définir dans votre fichier de configuration (par exemple, /etc/mysql/my.cnf dans la section [mysqld]), afin que les modifications restent en vigueur après un redémarrage de MySQL:

Fichier de configuration: /etc/mysql/my.cnf

[mysqld]
sql-mode="STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION"
0
alex