Mysql
 sql >> база данни >  >> RDS >> Mysql

Грешка, свързана с only_full_group_by при изпълнение на заявка в MySql

Просто бих добавил 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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Съхранение на IP адрес в MySQL база данни с помощта на PHP

  2. Как да направя заявка между две дати с MySQL?

  3. DAY() Примери – MySQL

  4. Създайте уебсайт с MySQL

  5. Използване на Python и MySQL в ETL процеса:SQLAlchemy