Mysql
 sql >> Database >  >> RDS >> Mysql

Errore relativo a only_full_group_by durante l'esecuzione di una query in MySql

Aggiungerei semplicemente group_id al GROUP BY .

Quando SELECT in una colonna che non fa parte di GROUP BY potrebbero esserci più valori per quella colonna all'interno dei gruppi, ma ci sarà spazio solo per un singolo valore nei risultati. Quindi, il database solitamente deve essere detto esattamente come trasformare quei valori multipli in un unico valore. Comunemente, questo viene fatto con una funzione aggregata come COUNT() , SUM() , MAX() ecc... Dico solitamente perché la maggior parte degli altri sistemi di database popolari insiste su questo. Tuttavia, in MySQL prima della versione 5.7 il comportamento predefinito era più clemente perché non si lamentava e quindi sceglieva arbitrariamente qualsiasi valore ! Ha anche un ANY_VALUE() funzione che potrebbe essere utilizzata come un'altra soluzione a questa domanda se avessi davvero bisogno dello stesso comportamento di prima. Questa flessibilità ha un costo perché non è deterministica, quindi non la consiglierei a meno che tu non abbia un'ottima ragione per averne bisogno. MySQL sta ora attivando only_full_group_by impostazione predefinita per buoni motivi, quindi è meglio abituarsi e fare in modo che le tue query rispettino.

Allora perché la mia semplice risposta sopra? Ho fatto un paio di ipotesi:

1) il group_id è unico. Sembra ragionevole, dopotutto è un 'ID'.

2) il group_name è anche unico. Questo potrebbe non essere un presupposto così ragionevole. Se questo non è il caso e hai dei group_names duplicati e poi segui il mio consiglio per aggiungere group_id al GROUP BY , potresti scoprire che ora ottieni più risultati rispetto a prima perché i gruppi con lo stesso nome avranno ora righe separate nei risultati. Per me, sarebbe meglio che nascondere questi gruppi duplicati perché il database ha selezionato un valore arbitrariamente in modo silenzioso!

È inoltre buona norma qualificare tutte le colonne con il nome della tabella o l'alias quando sono coinvolte più tabelle...

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