Просто бих добавил group_id
към GROUP BY
.
Когато SELECT
въвеждане на колона, която не е част от GROUP BY
може да има множество стойности за тази колона в рамките на групите, но ще има място само за една стойност в резултатите. И така, базата данни обикновено трябва да се каже как точно да се превърнат тези множество стойности в една стойност. Обикновено това се прави с агрегатна функция като COUNT()
, SUM()
, MAX()
и т.н... казвам обикновено защото повечето други популярни системи за бази данни настояват за това. Въпреки това, в MySQL преди версия 5.7 поведението по подразбиране беше по-прощаващо, защото няма да се оплаква и след това произволно избира която и да е стойност ! Освен това има ANY_VALUE()
функция, която може да се използва като друго решение на този въпрос, ако наистина имате нужда от същото поведение като преди. Тази гъвкавост има цена, тъй като е недетерминистична, така че не бих я препоръчал, освен ако нямате много основателна причина да се нуждаете от нея. MySQL вече включва only_full_group_by
настройка по подразбиране по основателни причини, така че е най-добре да свикнете с нея и да накарате заявките си да отговарят на нея.
И така, защо моят прост отговор по-горе? Направих няколко предположения:
1) group_id
уникално е. Изглежда разумно, все пак това е „идентификатор“.
2) group_names
също е уникален. Това може да не е толкова разумно предположение. Ако това не е така и имате някои дублиращи се group_names
и след това следваш съвета ми да добавиш group_id
към GROUP BY
, може да откриете, че сега получавате повече резултати от преди, защото групите със същото име вече ще имат отделни редове в резултатите. За мен това би било по-добре, отколкото тези дублиращи се групи да бъдат скрити, защото базата данни тихомълком е избрала стойност произволно!
Добра практика е също така всички колони да се квалифицират с тяхното име на таблица или псевдоним, когато има повече от една таблица...
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