mysql - 在 MySql 中执行查询时与 only_full_group_by 相关的错误

标签 mysql sql group-by mysql-error-1055

我已经升级了我的系统,并为我正在开发的 Web 应用程序安装了带有 php 的 MySql 5.7.9。我有一个动态创建的查询,在旧版本的 MySQL 中运行时它工作正常。自从升级到 5.7 后,我收到此错误:

Expression #1 of SELECT list is not in GROUP BY clause and contains non-aggregated column 'support_desk.mod_users_groups.group_id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

请注意 Mysql 5.7 手册页的主题 Server SQL Modes .

这是给我带来麻烦的查询:

SELECT mod_users_groups.group_id AS 'value', 
       group_name AS 'text' 
FROM mod_users_groups
LEFT JOIN mod_users_data ON mod_users_groups.group_id = mod_users_data.group_id 
WHERE  mod_users_groups.active = 1 
  AND mod_users_groups.department_id = 1 
  AND mod_users_groups.manage_work_orders = 1 
  AND group_name != 'root' 
  AND group_name != 'superuser' 
GROUP BY group_name 
HAVING COUNT(`user_id`) > 0 
ORDER BY group_name

我对 only_full_group_by 的理解不足以弄清楚我需要做什么来修复查询。我可以关闭 only_full_group_by 选项吗?还是还需要执行其他操作?

最佳答案

我只需将 group_id 添加到 GROUP BY 中。

SELECT不属于GROUP BY的列时,组内该列可能有多个值,但只有一个空间结果中的单个值。因此,数据库通常需要被准确告知如何将这些多个值变成一个值。通常,这是通过诸如 COUNT()SUM()MAX() 等聚合函数来完成的......我说通常因为大多数其他流行的数据库系统都坚持这一点。然而,在 MySQL 5.7 之前的版本中,默认行为更加宽容,因为它不会提示然后任意选择任何值!它还具有一个 ANY_VALUE() 函数,如果您确实需要与以前相同的行为,则可以将其用作此问题的另一个解决方案。这种灵 active 是有代价的,因为它是不确定的,所以我不会推荐它,除非你有充分的理由需要它。 MySQL 现在出于充分的原因默认打开 only_full_group_by 设置,因此最好习惯它并使您的查询符合它。

那么为什么我上面的简单回答呢?我做了一些假设:

1) group_id 是唯一的。看起来很有道理,毕竟是一个‘ID’。

2) group_name 也是唯一的。这可能不是一个合理的假设。如果情况并非如此,并且您有一些重复的 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

关于mysql - 在 MySql 中执行查询时与 only_full_group_by 相关的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40470178/

相关文章:

java - Mysql 更新似乎有效,但抛出语句关闭错误

python - Pandas df 操作 : new column with list of values if other column rows repeated

sql - 如何沿多条路径进行图遍历

Mysql更新和连接查询

mysql - SQL:使用 GROUP BY 子句选择第二低的值(通过子查询)

除非在某个位置有回显,否则 PHP 代码不会执行。为什么是这样?

mysql - 删除涉及 2 名以上员工的项目

php - 如何在整个数据库中搜索数据

sql - 在 SQL Server 中排序递归结果集

mysql - 按多列分组后选择最大计数