sql >> Database >  >> RDS >> Mysql

Fout gerelateerd aan only_full_group_by bij het uitvoeren van een query in MySql

Ik zou gewoon group_id . toevoegen naar de GROUP BY .

Wanneer SELECT een kolom plaatsen die geen deel uitmaakt van de GROUP BY er kunnen meerdere waarden zijn voor die kolom binnen de groepen, maar er zal slechts ruimte zijn voor een enkele waarde in de resultaten. Dus de database meestal moet precies worden verteld hoe die meerdere waarden in één waarde kunnen worden omgezet. Gewoonlijk wordt dit gedaan met een aggregatiefunctie zoals COUNT() , SUM() , MAX() enz... Ik zeg meestal omdat de meeste andere populaire databasesystemen hierop aandringen. In MySQL vóór versie 5.7 was het standaardgedrag echter meer vergevingsgezind omdat het niet zal klagen en vervolgens willekeurig elke waarde kiest ! Het heeft ook een ANY_VALUE() functie die als een andere oplossing voor deze vraag zou kunnen worden gebruikt als u echt hetzelfde gedrag als voorheen nodig had. Deze flexibiliteit brengt een prijs met zich mee omdat het niet-deterministisch is, dus ik zou het niet aanbevelen, tenzij je een heel goede reden hebt om het nodig te hebben. MySQL zet nu de only_full_group_by aan standaard ingesteld om goede redenen, dus het is het beste om eraan te wennen en ervoor te zorgen dat uw vragen eraan voldoen.

Dus waarom mijn simpele antwoord hierboven? Ik heb een aantal aannames gedaan:

1) de group_id is uniek. Lijkt redelijk, het is toch een 'ID'.

2) de group_name is ook uniek. Dit is misschien niet zo'n redelijke veronderstelling. Als dit niet het geval is en je hebt enkele dubbele group_names en je volgt dan mijn advies om group_id . toe te voegen naar de GROUP BY , zult u merken dat u nu meer resultaten krijgt dan voorheen omdat de groepen met dezelfde naam nu aparte rijen in de resultaten hebben. Voor mij zou dit beter zijn dan deze dubbele groepen verborgen te houden omdat de database stilletjes willekeurig een waarde heeft gekozen!

Het is ook een goede gewoonte om alle kolommen te kwalificeren met hun tabelnaam of alias wanneer er meer dan één tabel bij betrokken is...

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


  1. Ontbrekende indexen in MS SQL of optimalisatie in een mum van tijd

  2. Oracle Database 21c

  3. De weergave van DateTime in milliseconden?

  4. Hoe sys.dm_exec_describe_first_result_set werkt in SQL Server