sql >> Base de Datos >  >> RDS >> Mysql

Error relacionado con only_full_group_by al ejecutar una consulta en MySql

Simplemente agregaría group_id al GROUP BY .

Cuando SELECT ing una columna que no es parte del GROUP BY podría haber múltiples valores para esa columna dentro de los grupos, pero solo habrá espacio para un solo valor en los resultados. Entonces, la base de datos generalmente necesita que se le diga exactamente cómo convertir esos valores múltiples en un solo valor. Comúnmente, esto se hace con una función agregada como COUNT() , SUM() , MAX() etc... Digo generalmente porque la mayoría de los otros sistemas de bases de datos populares insisten en esto. Sin embargo, en MySQL anterior a la versión 5.7, el comportamiento predeterminado ha sido más indulgente porque no se quejará y luego elegirá arbitrariamente cualquier valor ! También tiene un ANY_VALUE() función que podría usarse como otra solución a esta pregunta si realmente necesitara el mismo comportamiento que antes. Esta flexibilidad tiene un costo porque no es determinista, por lo que no la recomendaría a menos que tenga una muy buena razón para necesitarla. MySQL ahora está activando only_full_group_by predeterminado por buenas razones, por lo que es mejor acostumbrarse y hacer que sus consultas lo cumplan.

Entonces, ¿por qué mi simple respuesta anterior? He hecho un par de suposiciones:

1) el group_id es único. Parece razonable, es una 'identificación' después de todo.

2) el group_name también es único. Esto puede no ser una suposición tan razonable. Si este no es el caso y tiene algunos group_names duplicados y luego sigue mi consejo para agregar group_id al GROUP BY , es posible que ahora obtenga más resultados que antes porque los grupos con el mismo nombre ahora tendrán filas separadas en los resultados. Para mí, esto sería mejor que tener estos grupos duplicados ocultos porque la base de datos ha seleccionado silenciosamente un valor arbitrariamente.

También es una buena práctica calificar todas las columnas con su nombre de tabla o alias cuando hay más de una tabla involucrada...

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