我已经升级了我的系统,并为我正在处理的一个web应用程序安装了带有php的MySQL5.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模式主题的MySQL5.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
添加到组by
中。
当select
ing不属于分组依据
的列时,该列在组中可能有多个值,但在结果中只有一个值的空间。因此,数据库通常需要知道如何将多个值转换为一个值。通常,这是通过聚合函数来完成的,如count()
、sum()
、max()
等。我说通常是因为大多数其他流行的数据库系统坚持这样做。然而,在5.7版本之前的MySQL,默认行为更加宽容,因为它不会抱怨,然后任意选择任何值!它还有一个any_value()
函数,如果您真的需要与以前相同的行为,它可以用作这个问题的另一个解决方案。这种灵活性是有代价的,因为它是非确定性的,所以我不会推荐它,除非您有非常好的理由需要它。MySQL现在在默认情况下打开only_full_group_by
设置,原因很充分,所以最好习惯它并使您的查询符合它。
那么为什么我上面简单的回答呢?我做了几个假设:
1)group_id
是唯一的。看起来很合理,毕竟它是一个“id”。
2)group_name
也是唯一的。这可能不是一个合理的假设。如果情况并非如此,并且您有一些重复的group_names
并且您然后按照我的建议将group_id
添加到组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浏览器--同样的错误。 查询: 错误: 我可能做了一些明显错误的事情,但任何帮助都将是感激的