C’è capacità ANY_VALUE per mysql 5.6?

attualmente sto lavorando con mysql 5.7 in sviluppo, e 5.6 in produzione. Ogni volta che eseguo una query con un gruppo in sviluppo ottengo qualche errore come “Error Code: 1055. Expression # 1 of SELECT list non è in GROUP BY”

Ecco la query.

SELECT c.id, c.name, i.* FROM countries c, images i WHERE i.country_id = c.id GROUP BY c.id; Fixed for 5.7; SELECT c.id, c.name, ANY_VALUE(i.url) url, ANY_VALUE(i.lat) lat, ANY_VALUE(i.lng) lng FROM countries c, images i WHERE i.country_id = c.id GROUP BY c.id; 

Per risolvere il problema uso la funzione mysql da 5.7 ANY_VALUE, ma il problema principale è che non è disponibile in mysql 5.6

Quindi, se risolvo l’istruzione sql per lo sviluppo, avrò un errore nella produzione.

Conoscete qualche soluzione o polifill per la funzione ANY_VALUE in mysql 5.6?

    Stai abusando della famigerata estensione MySQL non standard di GROUP BY . SQL standard rifiuterà sempre la tua query, perché stai citando le colonne che non sono aggregati e non sono menzionate in GROUP BY . Nel tuo sistema di sviluppo stai cercando di ANY_VALUE() con ANY_VALUE() .

    In produzione, puoi distriggersre la modalità MySQL ONLY_FULL_GROUP_BY. Prova a fare questo :

      SET @mode := @@SESSION.sql_mode; SET SESSION sql_mode = ''; /* your query here */ SET SESSION sql_mode = @mode; 

    Ciò consentirà a MySQL di accettare la tua richiesta.

    Ma guarda, la tua domanda non è veramente corretta. Quando riesci a persuaderlo a correre, restituisce una riga scelta a caso dalla tabella delle images . Quella sorta di indeterminatezza spesso causa confusione per gli utenti e il personale di supporto tecnico.

    Perché non rendere la query migliore, quindi sceglie una particolare immagine. Se la tua tabella images ha una colonna di identificazione automatica dell’incidente, puoi farlo per selezionare la “prima” immagine.

     SELECT c.id, c.name, i.* FROM countries c LEFT JOIN ( SELECT MIN(id) id, country_id FROM images GROUP BY country_id ) first ON c.id = first.country_id LEFT JOIN images i ON first.id = i.id 

    Ciò restituirà una riga per paese con un’immagine prevedibile mostrata.

    Invece di ANY_VALUE , puoi utilizzare le funzioni di aggregazione MIN o MAX .

    In alternativa, è ansible non impostare la modalità SQL ONLY_FULL_GROUP_BY , che è impostata di default per MySql 5.7, ed è responsabile della differenza che si prova con MySql 5.6. Quindi è ansible ritardare l’aggiornamento delle query fino a quando non sono stati migrati tutti gli ambienti in MySql 5.7.

    Quale delle due è l’opzione migliore, è discutibile, ma a lungo termine sarà meglio adattare le query in modo che aderiscano alla regola ONLY_FULL_GROUP_BY . Usare MIN o MAX può certamente essere utile per farlo.

    Per decenni potresti scrivere query che non erano valide in SQL standard ma mysql perfettamente valido

    Nell’SQL standard, una query che include una clausola GROUP BY non può fare riferimento a colonne non aggregate nell’elenco di selezione che non sono denominate nella clausola GROUP BY. Ad esempio, questa query è illegale in SQL standard perché la colonna del nome non aggregata nell’elenco di selezione non viene visualizzata in GROUP BY:

    SELEZIONA o.custid, c.name, MAX (o.payment) DA ordini AS o, clienti AS c WHERE o.custid = c.custid GROUP BY o.custid; Affinché la query sia legale, la colonna del nome deve essere omessa dall’elenco di selezione o denominata nella clausola GROUP BY.

    MySQL estende l’utilizzo SQL standard di GROUP BY in modo che l’elenco di selezione possa fare riferimento a colonne non aggregate non denominate nella clausola GROUP BY.

    Questo viene dalla pagina del manuale di Mysql 5.6 su GROUP BY . Se guardi la stessa pagina per 5.7.6 vedi che le cose sono cambiate. E cambiato radicalmente !!

    Quella pagina ti dà anche la soluzione. Disabilita ONLY_FULL_GROUP_BY Ciò renderà ansible che la tua vecchia query 5.6 funzioni su 5.7.6 (rimuovi ANY_VALUE dalla tua query poiché non è disponibile in 5.7.6 ma usa invece ONLY_FULL_GROUP_BY).