Error: SELECT list is not in GROUP BY clause and contains nonaggregated column

Cercando di eseguire la query sql di una SELECT con JOIN su più tabelle, ed infine raggruppare il risultato con la clausola GROUP BY su Id della tabella principale, ricevo il seguente messaggio di errore:

SELECT list is not in GROUP BY clause and contains nonaggregated column

 

Perché si verifica e come posso risolvere?

Risolta 4
MySql 29-08-2024 2 Risposte 136 Visite 0

Risposte ( 2 approvate )

  1. AskDB Staff
    +2
    29-08-2024 10:01:07
    Rispondi

    Si riceve il messaggio di errore "SELECT list is not in GROUP BY clause and contains nonaggregated column", perché in MySql a partire dalla versione 5.7.5 (e superiori) è attiva di default la modalità ONLY_FULL_GROUP_BY

    Questa non consente di eseguire query di tipo SELECT su colonne aventi condizioni HAVING o raggruppare records con colonne che non vengono espressamente dichiarate nella ORDER BY; di default qualsiasi query di questo tipo viene in automatico rifiutata da MySql ritornando quel messaggio di errore.

     

    Le possibili soluzioni all'errore sono:

    1. Disabilitare la variabile globale ONLY_FULL_GROUP_BY mode, eseguendo l'istruzione:
      • SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
      • Modificare la variabile sql mode tramite PhpMyAdmin nella sezione variabili (se avete i permessi per farlo), rimuovendo da essa il valore testuale ONLY_FULL_GROUP_BY
    2. Specificare nella clausola GROUP BY della vostra SELECT, tutte le colonne che non appartengono alla tabella principale o che sono ricavate da funzioni aggregate e/o con condizioni (vedasi: MAX, MIN, COUNT, HAVING etc.)
    3. Al contrario dal punto due, considerare nella SELECT solo le colonne rilevanti e non aggregate della tabella principale.

     

    Potreste anche prendere in considerazione la possibilità di togliere la clausola ONLY_FULL_GROUP_BY; se analizzate e strutturate bene la vostra query in tanti casi non ve ne è bisogno, e rimuovere e risolvere così a monte l'errore "SELECT list is not in GROUP BY clause and contains nonaggregated column" senza necessariamente intervenire sul valore ONLY_FULL_GROUP_BY della variabile sql-mode.

  2. Giorgio Borelli
    +1
    29-08-2024 10:10:55
    Rispondi

    Importante sottolineare che eseguendo l'istruzione

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

    per modificare la variabile sql-mode , questa avrà effetto solo sulla query interessata e la modifica non sarà permanente sull'intero db.

     

    Per rendere permanente la modifica alla sql-mode e disabilitare in modo definitivo il valore ONLY_FULL_GROUP_BY, dovete intervenire sul file di configurazione di MySql, che solitamente si trova in

    /etc/mysql/my.cnf

    Stoppate il server MySql, dopodiché editate il file my.cnf, al suo interndo individuate la stringa con il valore sql-mode (nella sezione [mysqld] e rimuovete il testo ONLY_FULL_GROUP_BY dai valori assegnati alla variabile (troverete più valori separati da virgola), salvate ed infine fate ripartire MySql. Da adesso in poi questa modalità non sarà più attiva di default.

Rispondi

Per poter rispondere a questa domanda, devi essere registrato e loggato sul sito, dopodichè compila il box sottostante cercando di essere il più chiaro ed esauriente possibile, la tua risposta potrebbe essere la soluzione che l'utente cerca ed essere contrassegnata come migliore, consentendoti così di ottenere punti ed autorevolezza.

AskDB Staff

AskDB Staff

Autore di questa domanda

 Domanda Precedente

 Elenco Domande 

Domanda Successiva