Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Fehler im Zusammenhang mit only_full_group_by beim Ausführen einer Abfrage in MySql

Ich würde einfach group_id hinzufügen zu GROUP BY .

Wenn SELECT eine Spalte verwenden, die nicht Teil von GROUP BY ist Innerhalb der Gruppen könnten mehrere Werte für diese Spalte vorhanden sein, aber in den Ergebnissen ist nur Platz für einen einzelnen Wert. Also die Datenbank normalerweise muss genau gesagt werden, wie diese mehreren Werte zu einem Wert gemacht werden. Üblicherweise geschieht dies mit einer Aggregatfunktion wie COUNT() , SUM() , MAX() etc... Ich sage normalerweise weil die meisten anderen populären Datenbanksysteme darauf bestehen. In MySQL vor Version 5.7 war das Standardverhalten jedoch nachsichtiger, da es sich nicht beschwert und dann willkürlich irgendeinen Wert auswählt ! Es hat auch einen ANY_VALUE() Funktion, die als weitere Lösung für diese Frage verwendet werden könnte, wenn Sie wirklich dasselbe Verhalten wie zuvor benötigen. Diese Flexibilität ist mit Kosten verbunden, da sie nicht deterministisch ist. Daher würde ich sie nicht empfehlen, es sei denn, Sie haben einen sehr guten Grund, sie zu benötigen. MySQL schaltet jetzt only_full_group_by ein Standardeinstellung aus guten Gründen, daher ist es am besten, sich daran zu gewöhnen und Ihre Abfragen daran anzupassen.

Warum also meine einfache Antwort oben? Ich habe ein paar Annahmen getroffen:

1) die group_id ist einzigartig. Scheint vernünftig, es ist immerhin eine 'ID'.

2) der group_name ist auch einzigartig. Dies ist möglicherweise keine so vernünftige Annahme. Wenn dies nicht der Fall ist und Sie einige doppelte group_names haben und Sie folgen dann meinem Rat, group_id hinzuzufügen zu GROUP BY , stellen Sie möglicherweise fest, dass Sie jetzt mehr Ergebnisse als zuvor erhalten, da die Gruppen mit demselben Namen jetzt separate Zeilen in den Ergebnissen haben. Für mich wäre das besser, als diese doppelten Gruppen auszublenden, weil die Datenbank stillschweigend willkürlich einen Wert ausgewählt hat!

Es empfiehlt sich auch, alle Spalten mit ihrem Tabellennamen oder Alias ​​zu qualifizieren, wenn mehr als eine Tabelle beteiligt ist ...

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