2016-06-21 6 views
25

l'è mia domanda:# 1055 - Manifestazione di lista SELECT non è nella clausola GROUP BY e contiene colonna nonaggregated questo è incompatibile con sql_mode = only_full_group_by

select libelle,credit_initial,disponible_v,sum(montant) as montant 
FROM fiche,annee,type where type.id_type=annee.id_type and annee.id_annee=fiche.id_annee 
and annee = year(current_timestamp) GROUP BY libelle order by libelle asc 
  • Mysql 5.7.9 esegue la query senza alcuna problema, ma mysql 5.7.12 visualizzare l'errore precedente la prego di aiutare in questo
+1

ci si aspetta che tu abbia libelle, credit_initila e disponible_v tutto nel gruppo per dichiarazione –

+0

http://mechanics.flite.com/blog/2013/02/12/why-i-use- only-full-group-by/ – bishop

+1

Possibile duplicato di [Ricevo un errore in MySql relativo a solo \ _full \ _group \ _by quando si esegue una query] (http://stackoverflow.com/questions/34115174/i-am -getting-an-error-in-mysql-related-to-only-full-group-by-when-executing-a-qu) –

risposta

55

I ettaro Ho lottato per far funzionare tutto ciò che ho provato e funziona su lamp server mysql versione 5.12

Così, passi per il successo:

  1. sudo vim /etc/mysql/conf.d/mysql.cnf
  2. Scorrere fino alla fine del file di copia e incolla

    [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

alla fine del file

  1. salvare e uscire dalla modalità di immissione
  2. sudo service mysql restart per riavviare MySQL.

Fatto!

+4

I risolto lo stesso problema rimuovendo solo: STRICT_TRANS_TABLES dalla sql_mode = stringa in /etc/mysql/my.cnf in Ubuntu 16.04 (MySQL 5.7) e riavvio mysql: systemctl restart mysql – Grant

+1

** Per coloro che non riescono a trovare questo file ** my il file è stato chiamato ** my.ini ** è lo stesso di ** mysql.cnf ** – Radmation

+0

Ha funzionato per me Grazie mille @Baktete –

4

bisogna aggregare da nulla NOT IN la clausola group by.

Quindi, ci sono due opzioni ... Aggiungi Credit_Initial e Disponible_v al group by

O

cambiarli a MAX(Credit_Initial) as Credit_Initial, MAX(Disponible_v) as Disponible_v se si conoscono i valori sono costanti in ogni caso e non hanno altro impatto

11

è necessario specificare tutte le colonne che non si sta usando per una funzione di aggregazione nella vostra GROUP BY clausola in questo modo:

select libelle,credit_initial,disponible_v,sum(montant) as montant 
FROM fiche,annee,type where type.id_type=annee.id_type and annee.id_annee=fiche.id_annee 
and annee = year(current_timestamp) GROUP BY libelle,credit_initial,disponible_v order by libelle asc 

La modalità full_group_by rende praticamente si scrive SQL più idiomatica. Puoi disattivare questa impostazione se lo desideri. Esistono diversi modi per eseguire ciò che sono descritti nello MySQL Documentation. Ecco la definizione di MySQL di ciò che ho detto sopra:

MySQL 5.7.5 e su implementa il rilevamento della dipendenza funzionale. Se la modalità SQL ONLY_FULL_GROUP_BY è abilitata (che è predefinita), MySQL rifiuta le query per le quali l'elenco di selezione, la condizione HAVING o l'elenco ORDER BY si riferiscono a colonne non aggregate che non sono né denominate in clausola GROUP BY. funzionalmente dipendente da loro. (Prima 5.7.5, MySQL non rileva dipendenza funzionale e ONLY_FULL_GROUP_BY non è abilitato di default. Per una descrizione di pre-5.7.5 comportamento, vedere la MySQL 5.6 Manuale di riferimento.)

Sei ottenere l'errore perché sei su una versione 5.7.5 <

+0

Sono su ubuntu mysql 5.7. 12 qualsiasi altra opzione disponibile perché ho altre query che ho bisogno di come trasformare solo il gruppo completo di –

2

Base ond defualt config di 5.7.5 ONLY_FULL_GROUP_BY si dovrebbe usare tutta la colonna non aggregata nel vostro gruppo per

select libelle,credit_initial,disponible_v,sum(montant) as montant 
FROM fiche,annee,type 
where type.id_type=annee.id_type 
and annee.id_annee=fiche.id_annee 
and annee = year(current_timestamp) 
GROUP BY libelle,credit_initial,disponible_v order by libelle asc 
+0

non ha alcun senso, se si conta per qualche id (indice che punta ad un'altra tabella), allora perché dovresti aggiungere l'altro colonne che non sono correlate al conteggio nel gruppo, soprattutto se non si desidera raggruppare per queste colonne – fdsfdsfdsfds

+0

@fdsfdsfdsfds Questo è ciò che la clausola obbliga a fare. ONLY_FULL_GROUP_BY richiede che tutte le colonne che non sono gestite dalle funzioni di aggregazione siano dichiarate nel gruppo da ... la soluzione fornita dall'OP modifica ONLY_FULL_GROUP_BY sql_mode ma questo non è sql correttamente (anche se è predefinito da mysql fino a 5.7 per impostazione predefinita) – scaisEdge

24

questo ha funzionato per me:

mysql -u root -p 
mysql > SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY','')); 

Potrebbe essere necessario sudo per la prima fase:

sudo mysql -u root -p 
+0

alla fine questa è stata l'unica cosa che ha funzionato anche per me – Xoundboy

+0

Sono arrivato a pensare che questa soluzione persiste solo fino al riavvio di mysql. La soluzione accettata è migliore. – Henry

+0

grazie. Funziona come chram – Murali

-1

basta andare al vassoio finestra in basso click sull'icona WAMP, clicca mysql> mia. ini, poi c'è un'opzione; sql-mode = "" togliere il commento lo rendono come sql-mode = "" e riavviare WAMP ha lavorato per me

7

È possibile disattivare sql_mode = only_full_group_by da alcuni dei comandi si può provare questo da terminale o MySql IDE

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'; 

Ho provato questo e ha lavorato per me. Grazie :)

+0

grazie anche a questo funziona per me – User1703

Problemi correlati