没有GROUP BY的聚合查询

Rus*_*ust 8 php mysql

这个查询似乎在我的旧机器上运行完美.但是,在我的MySQL 5.7.14和PHP 5.6.25的新机器上似乎抛出一个错误:

致命错误:带有消息'SQLSTATE [42000]的未捕获异常'PDOException':语法错误或访问冲突: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();
Run Code Online (Sandbox Code Playgroud)

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

JNe*_*ill 11

一个变化是在版本5.7制成,上下的地方现在,默认情况下,拒绝它你可以将使用功能(查询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
Run Code Online (Sandbox Code Playgroud)

  • @Fred-ii- 他们不必进行 GROUP BY。他们还可以在剩余的字段周围抛出一个聚合函数,比如“SELECT max(id), max(password), count(id)”可能更接近于没有“GROUP BY”的同一查询的任意性质,但感觉非常错误。 (3认同)
  • 所以换句话说,他们被迫做一个`GROUP BY`。 (2认同)
  • @MER 这一切都与数据完整性有关。想象一个简单的表作为`id | Parent_id` 和两行:`1 | 3`,`2 | 3`. 然后你发出:`SELECT Id,parent_id FROM table GROUP BY Parent_id;`。旧的 mysql 不会像其他 RDBMS 一样出错,它会吐出一条记录。但是...它会选择哪个“id”?“1”还是“2”?完全看机会。你把它包装在一个应用程序中,你的用户得到 1 并再次运行并得到 2,然后运行并得到 1...废话。 (2认同)

小智 7

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

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

     mysql > SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
Run Code Online (Sandbox Code Playgroud)

有关此问题的更多信息,请参见Table PlusJNevill上面引用的其他链接。

希望它可以帮助别人。

  • 是的,当您的任务是打扫房间时,扫除地毯下的污垢肯定很有用。 (3认同)

小智 5

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

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