这个查询似乎在我的旧机器上完美运行。但是,在我使用 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();
为什么我现在会收到此错误?我该如何解决它?
5.7.5 版本中进行了更改,现在默认情况下,将拒绝使用
sum
中的函数(avg
、max
、SELECT
等)进行聚合的查询。子句,并且无法将非聚合字段放入 GROUP BY
子句中。这种行为是所有其他 RDBMS 的重要组成部分,MySQL 终于加入了。
您有两个选择:
选项 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 子句中排除非聚合列)。有关允许例外的示例,请参阅上面的链接。
此命令可能对遇到相同错误的其他人有用
mysql > SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
有关此内容的更多信息可以在
Table Plus 以及 JNevill 上面引用的其他链接找到。
希望对其他人有帮助。
这将允许不太严格的查询,但会牺牲正常格式正确的 sql 调用的安全性(仍然不是 100% 安全),但将允许使用其他 sql 调用,如果编写不当,这些调用可能会不安全。
以下步骤帮助了我并节省了我很多时间。
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;
希望对某人有帮助!
谢谢