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