没有 GROUP BY 的聚合查询

新手上路,请多包涵

这个查询似乎在我的旧机器上运行良好。但是,在我使用 MySQL 5.7.14 和 PHP 5.6.25 的新机器上,它似乎抛出了一个错误:

致命错误:未捕获的异常 ‘PDOException’ 带有消息’SQLSTATE [42000]:语法错误或访问冲突:1140 在没有 GROUP BY 的聚合查询中,SELECT 列表的表达式 #1 包含非聚合列 ‘pixel_perfect.users.id’;这与 C:\wamp64\www 中的 sql_mode=only_full_group_by’ 不兼容

这是我的查询的样子:

 $sql="SELECT id, password, COUNT(id) AS count FROM users WHERE email = :email LIMIT 1";

$stmt=$db->prepare($sql);
$stmt->bindValue(':email', $email);
$stmt->execute();

为什么我现在收到此错误,我该怎么做才能轻松解决它。

原文由 Rusty 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 590
2 个回答

在版本 5.7.5 中进行了更改, 现在默认情况下,它会拒绝使用函数聚合的查询( sumavgmax 等)在 SELECT 子句中,并且未能将非聚合字段放入 GROUP BY 子句中。这种行为是所有其他 RDBMS 的重要组成部分,MySQL 终于加入了进来。

你有两个选择:

  1. 您可以将 MySQL 设置更改为默认为旧行为,以允许这样的不太好的查询。信息可以在 这里 找到
  2. 您可以修复您的查询

选项 2 看起来像:

 SELECT id, password, COUNT(id) AS count FROM users WHERE email = :email GROUP BY id, password LIMIT 1

还需要注意的是,如果未聚合列被限制为单个值(例如 WHERE 子句中的过滤器),5.7.5 和更新版本允许从 GROUP BY 子句中排除非聚合列.有关此允许例外的示例,请参见上面的链接。

原文由 JNevill 发布,翻译遵循 CC BY-SA 4.0 许可协议

最简单的答案,在 config/database.php 中确保为 mysql 设置设置 strict => true 到 strict => false。

这将允许不严格的查询,但以牺牲正常格式的 sql 调用的安全性为代价(仍然不是 100% 安全),但将允许使用其他如果编写不当可能不安全的 sql 调用。

原文由 Taurean Wooley 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏