我已经升级了我的系统,并为我正在开发的web应用程序安装了MySql 5.7.9和php。我有一个查询,是动态创建的,当运行在旧版本的MySQL它工作得很好。自从升级到5.7,我得到这个错误:
SELECT列表的表达式#1不在GROUP BY子句中,并且包含
未聚合列的support_desk.mod_users_groups。Group_id '就是
在功能上不依赖于GROUP BY子句中的列;这是
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选项,或者还有其他需要做的事情?
您可以像其他答案中解释的那样关闭警告消息,或者您可以了解发生了什么并修复它。
从MySQL 5.7.5开始,默认的SQL模式只包括ONLY_FULL_GROUP_BY,这意味着当你对行进行分组,然后从组中选择一些东西时,你需要显式地说应该从哪一行进行选择。
Mysql需要知道您要查找组中的哪一行,这为您提供了两个选项
你也可以将你想要的列添加到group语句group中,通过矩形。color,矩形。value,这在某些情况下可以是你想要的,否则会返回相同颜色的重复结果,这可能不是你想要的
你也可以使用mysql的聚合函数来指示你在AVG() MIN() MAX()完整列表中的组中寻找哪一行
最后,如果您确定组内的所有结果都相同,则可以使用ANY_VALUE()。医生
这有助于我理解整个问题:
https://stackoverflow.com/a/20074634/1066234
https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html
下面是另一个问题查询的例子。
问题:
SELECT COUNT(*) as attempts, SUM(elapsed) as elapsedtotal, userid, timestamp, questionid, answerid, SUM(correct) as correct, elapsed, ipaddress FROM `gameplay`
WHERE timestamp >= DATE_SUB(NOW(), INTERVAL 1 DAY)
AND cookieid = #
通过在最后加上这个来解决:
GROUP BY timestamp, userid, cookieid, questionid, answerid, elapsed, ipaddress
注意:查看PHP中的错误消息,它会告诉您问题出在哪里。
例子:
MySQL查询错误1140:在没有GROUP BY的聚合查询中,SELECT列表中的表达式#4包含非聚合列'db.gameplay.timestamp';这与sql_mode=only_full_group_by不兼容-查询:SELECT COUNT(*) as attempts, SUM(elapsed) as elapsedtotal,用户id,时间戳,questionid, answerid, SUM(correct) as correct, elapsed, ipaddress FROM gameplay
WHERE时间戳>= DATE_SUB(NOW(),间隔1天)
AND userid = 1
在本例中,表达式#4在GROUP BY中缺失。
您可以像其他答案中解释的那样关闭警告消息,或者您可以了解发生了什么并修复它。
从MySQL 5.7.5开始,默认的SQL模式只包括ONLY_FULL_GROUP_BY,这意味着当你对行进行分组,然后从组中选择一些东西时,你需要显式地说应该从哪一行进行选择。
Mysql需要知道您要查找组中的哪一行,这为您提供了两个选项
你也可以将你想要的列添加到group语句group中,通过矩形。color,矩形。value,这在某些情况下可以是你想要的,否则会返回相同颜色的重复结果,这可能不是你想要的
你也可以使用mysql的聚合函数来指示你在AVG() MIN() MAX()完整列表中的组中寻找哪一行
最后,如果您确定组内的所有结果都相同,则可以使用ANY_VALUE()。医生
mac:
1.复制默认的my-default.cnf到/etc/my.cnf
sudo cp $(brew --prefix mysql)/support-files/my-default.cnf /etc/my.cnf
2.使用您喜欢的编辑器更改my.cnf中的sql_mode并将其设置为此
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
3.重新启动MySQL服务器。
mysql.server restart
我使用Laravel 5.3, mysql 5.7.12,在Laravel homestead(0.5.0,我相信)
即使在显式地设置编辑/etc/mysql/my.cnf以反映:
[mysqld]
sql_mode = STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
我仍然在接收错误。
我不得不改变config/database.php从true到false:
'mysql' => [
'strict' => false, //behave like 5.6
//'strict' => true //behave like 5.7
],
进一步阅读:
https://laracasts.com/discuss/channels/servers/set-set-sql-mode-on-homestead
https://mattstauffer.co/blog/strict-mode-and-other-mysql-customizations-in-laravel-5-2