在 mysql 8 中使用 GROUP BY

Moh*_*our 2 php mysql mysql-8.0

我已经升级了 MySQL 服务器,现在我遇到了 group by 问题

select * from tickets WHERE `status` = 0 group by `tnumber` ORDER BY `created_at` DESC
Run Code Online (Sandbox Code Playgroud)

错误是:

SELECT 列表不在 GROUP BY 子句中并且包含非聚合列

更新:我的表格内容是:

select * from tickets WHERE `status` = 0 group by `tnumber` ORDER BY `created_at` DESC
Run Code Online (Sandbox Code Playgroud)

我的代码是:

SELECT * FROM tickets 
WHERE `tnumber` IN ( 
                      SELECT tnumber FROM tickets GROUP BY tnumber
                   )  
Run Code Online (Sandbox Code Playgroud)

但是group by在第二个Select中,没有任何影响!如何以正确的方式去做呢?

GROUP BY 语句通常与聚合函数(COUNT、MAX、MIN、SUM、AVG)一起使用,以按一列或多列对结果集进行分组。

Har*_*shi 5

根据您的问题,查询在升级之前似乎运行正常MySql。由于您已升级MySql,因此已应用默认设置,这意味着Only_Full_Group_By已启用。因此,如果您想要执行类似查询(其中Select列表中的非聚合列不在group by子句中)的查询,则需要禁用Only_Full_Group_By.

运行下面的语句并再次执行您的查询:

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

警告:仅当您确定选择列表中的其他非聚合列对于每个列都是唯一的时才应执行此操作,tnumber否则您将得到随机行。

以下引用自MYSQL 8.0手册:

MySQL实现了函数依赖的检测。如果启用 ONLY_FULL_GROUP_BY SQL 模式(默认情况下),MySQL 将拒绝选择列表、HAVING 条件或 ORDER BY 列表引用既未在 GROUP BY 子句中命名也不在功能上依赖于它们的非聚合列的查询。

如果禁用 ONLY_FULL_GROUP_BY,则 GROUP BY 标准 SQL 使用的 MySQL 扩展允许选择列表、HAVING 条件或 ORDER BY 列表引用非聚合列,即使这些列在功能上不依赖于 GROUP BY 列。这会导致 MySQL 接受前面的查询。在这种情况下,服务器可以自由地从每个组中选择任何值,因此除非它们相同,否则选择的值是不确定的,这可能不是您想要的。此外,添加 ORDER BY 子句不会影响每个组中值的选择。结果集排序发生在选择值之后,ORDER BY 不会影响服务器在每个组中选择哪个值。当您知道由于数据的某些属性,未在 GROUP BY 中命名的每个非聚合列中的所有值对于每个组都相同时,禁用 ONLY_FULL_GROUP_BY 主要很有用。

欲了解更多信息请点击这里