不带分组依据的聚合查询

2022-08-30 13:20:42

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

为什么我现在得到这个错误,我该怎么做才能无痛地解决它。


答案 1

在版本 5.7-ish 中进行了更改,默认情况下,它将拒绝使用子句中的函数(、、等)进行聚合的查询,并且无法将非聚合字段放入子句中。这种行为是所有其他RDBMS的重要组成部分,MySQL终于跳上了船。sumavgmaxSELECTGROUP BY

您有两种选择:

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

选项 2 将如下所示:

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

答案 2

它有点晚了,但我只是遇到了这个错误。

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

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

有关这方面的更多信息可以在Table PlusJNevill上面引用的其他链接中找到。

希望它能帮助别人。


推荐