Jag skulle bara lägga till group_id
till GROUP BY
.
När SELECT
en kolumn som inte är en del av GROUP BY
det kan finnas flera värden för den kolumnen inom grupperna, men det kommer bara att finnas plats för ett enda värde i resultaten. Så databasen vanligtvis måste få veta exakt hur man gör dessa flera värden till ett värde. Vanligtvis görs detta med en aggregerad funktion som COUNT()
, SUM()
, MAX()
osv... Jag säger vanligtvis eftersom de flesta andra populära databassystem insisterar på detta. Men i MySQL före version 5.7 har standardbeteendet varit mer förlåtande eftersom det inte kommer att klaga och sedan godtyckligt välja valfritt värde ! Den har också en ANY_VALUE()
funktion som skulle kunna användas som en annan lösning på denna fråga om du verkligen behövde samma beteende som tidigare. Denna flexibilitet kommer till en kostnad eftersom den är icke-deterministisk, så jag skulle inte rekommendera den om du inte har en mycket bra anledning att behöva den. MySQL aktiverar nu only_full_group_by
inställningen som standard av goda skäl, så det är bäst att vänja sig vid det och få dina frågor att överensstämma med det.
Så varför mitt enkla svar ovan? Jag har gjort ett par antaganden:
1) group_id
är unik. Verkar rimligt, det är trots allt ett "ID".
2) group_name
är också unik. Detta kanske inte är ett så rimligt antagande. Om så inte är fallet och du har några dubbletter av group_names
och sedan följer du mitt råd att lägga till group_id
till GROUP BY
, kan du upptäcka att du nu får fler resultat än tidigare eftersom grupperna med samma namn nu kommer att ha separata rader i resultaten. För mig skulle detta vara bättre än att ha dessa dubbla grupper gömda eftersom databasen tyst har valt ett värde godtyckligt!
Det är också bra att kvalificera alla kolumner med deras tabellnamn eller alias när det är mer än en tabell inblandad...
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