当前位置: 首页 > 面试题库 >

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

汪安宁
2023-03-14
问题内容

我已经升级了系统,并为正在使用的Web应用程序安装了带有PHP的MySql
5.7.9。我有一个动态创建的查询,当在旧版本的MySql中运行时,它运行良好。自升级到5.7以来,出现此错误:

SELECT列表的表达式#1不在GROUP
BY子句中,并且包含未聚合的列’support_desk.mod_users_groups.group_id’,该列在功能上不依赖于GROUP
BY子句中的列;这与sql_mode = only_full_group_by不兼容

请注意有关“服务器SQL模式”主题的Mysql 5.7的“手册”页面。

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

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()等…我说 一般
,因为大多数其他流行的数据库系统坚持这一点。但是,在版本5.7之前的MySQL中,默认行为更为宽容,因为它不会抱怨,然后可以任意选择 任何值
!它也有一个ANY_VALUE()如果您确实需要与以前相同的行为,则可以将该函数用作该问题的另一个解决方案。这种灵活性要付出一定的代价,因为它是不确定性的,因此除非您有充分的理由需要它,否则我不建议您这样做。现在,由于only_full_group_by种种原因,MySQL默认情况下会启用该设置,因此最好习惯它,并使您的查询符合该设置。

那么,为什么我上面的简单答案呢?我做了两个假设:

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


 类似资料:
  • 问题内容: 我已经升级了系统,并为正在使用的Web应用程序安装了带有PHP的MySql 5.7.9。我有一个动态创建的查询,当在旧版本的MySql中运行时,它运行良好。自升级到5.7以来,出现此错误: SELECT列表的表达式#1不在GROUP BY子句中,并且包含未聚合的列’support_desk.mod_users_groups.group_id’,该列在功能上不依赖于GROUP BY子句中

  • 我已经升级了我的系统,并为我正在处理的一个web应用程序安装了带有php的MySQL5.7.9。我有一个动态创建的查询,当运行在旧版本的MySql中时,它可以正常工作。自从升级到5.7后,我遇到以下错误: SELECT列表的表达式#1不在GROUP BY子句中,并且包含非聚合列'SUPPORT_DESK.MOD_USERS_GROUPS.GROUP_ID',该列在功能上不依赖于GROUP BY子句

  • 我想在我的DB中创建一个视图,下面是我的代码和错误消息 但是,还是不能为我工作...谁能告诉我哪里可以修?

  • 查询: 有人有解决办法吗?

  • 问题内容: 我很好奇为何应该比更快地执行。 当比尔·卡尔文提出一个要点时,我正在回答一个问题。当您使用它时,它使用相关子查询(依赖子查询),而IN()仅使用子查询。 解释显示,并且两者都使用了一个依赖子查询,并且都只使用了一个子查询..所以我很好奇关联子查询如何比子查询更快? 我以前使用过EXISTS,它的执行速度比IN快,这就是我感到困惑的原因。 这是带有说明的SQLFIDDLE 一些问题 在上

  • 我对Neo4J花了不少心思,但对graphql却一筹莫展 我通过运行以下操作创建了graphql模式: 我有一个带有三个标签的节点类型。我尝试在graphiql中运行以下查询,得到了同样的错误。由于堆栈的原因,我想知道graphiql是否在添加meta并移动到了neo4j浏览器--同样的错误。 查询: 错误: 我可能做了一些明显错误的事情,但任何帮助都将是感激的