不带GROUP BY的聚合查询

问题描述 投票:0回答:5

这个查询似乎在我的旧机器上完美运行。但是,在我使用 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();

为什么我现在会收到此错误?我该如何解决它?

php sql mysql group-by
5个回答
60
投票

5.7.5 版本中进行了更改,现在默认情况下,将拒绝使用

sum
中的函数(
avg
max
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 子句中排除非聚合列)。有关允许例外的示例,请参阅上面的链接。


37
投票
有点晚了,但我刚刚遇到了这个错误。

此命令可能对遇到相同错误的其他人有用

mysql > SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));

有关此内容的更多信息可以在

Table Plus 以及 JNevill 上面引用的其他链接找到。

希望对其他人有帮助。


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

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


0
投票
将你的SQL模式更改为默认..它将执行而不会出错 SQL 模式定义了查询的语法。如果您使用 ONLY_FULLY_GROUPBY,则必须为所有聚合器函数编写带有 group by 的查询


0
投票
我最近遇到了这个错误,

以下步骤帮助了我并节省了我很多时间。

SET GLOBAL sql_mode = (SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY','')); SET SESSION sql_mode = (SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY','')); SELECT @@sql_mode;
希望对某人有帮助!
谢谢

© www.soinside.com 2019 - 2024. All rights reserved.