gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 18:08:04 24 4
gpt4 key购买 nike

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

Expression #1 of SELECT list is not in GROUP BY clause and containsnon-aggregated column 'support_desk.mod_users_groups.group_id' which isnot functionally dependent on columns in GROUP BY clause; this isincompatible 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/47655021/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com