php 不带GROUP BY的聚合查询

af7jpaap  于 2023-04-28  发布在  PHP
关注(0)|答案(4)|浏览(208)

这个查询似乎在我的旧机器上运行得很好。在我的新机器上,MySQL 5。7.14和PHP 56.25它抛出错误:
致命错误:未捕获的异常“PDOException”,消息为“SQLSTATE[42000]”:语法错误或访问冲突:1140在没有GROUP BY的聚合查询中,SELECT列表的表达式#1包含非聚合列“ www.example.com 兼容
下面是我的查询:

$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();

为什么我现在得到这个错误,我可以做些什么来解决它?

ws51t4hk

ws51t4hk1#

一个change was made in version 5.7.5,默认情况下,它将拒绝使用函数(sumavgmax等)聚合的查询。),并未能将非聚合字段放入GROUP BY子句中。这种行为是所有其他RDBMS的一部分,MySQL最终也加入了进来。
你有两个选择:
1.您可以将MySQL设置更改为默认的旧行为,以允许像这样的不太好的查询。信息可在here中找到
1.您可以修复查询
选项2看起来像:

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

同样重要的是要注意,在5中允许从GROUP BY子句中排除非聚合列。7.5及更新版本,如果非聚合列被限制为单个值(例如WHERE子句中的筛选器)。有关此允许的例外的示例,请参见上面的链接。

qf9go6mv

qf9go6mv2#

有点晚了,但我刚刚遇到了这个错误。
对于遇到相同错误的其他人,此命令可能很有用

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

更多信息可以在Table Plus和上面引用的其他链接上找到JNevill
希望它能帮助其他人。

8ljdwjyq

8ljdwjyq3#

最简单的答案,在config/database中。php确保在mysql设置中设置strict =〉true到strict =〉false。
这将允许以正常的格式良好的sql调用(仍然不是100%安全的)的安全性为代价的不太严格的查询,但将允许使用其他sql调用,如果编写不当,可能是不安全的。

ejk8hzay

ejk8hzay4#

将您的SQL模式更改为默认模式。SQL模式定义了查询的语法。如果使用ONLY_FULLY_GROUPBY,则必须为所有聚合器函数编写一个带有groupby的查询

相关问题