GROUP BY 语句抛出错误教程不是

GROUP BY statement throwing errors tutorial isn't

你好,我正在阅读有关 SQL 联接的教程,下面的语句会抛出“sql_mode=only_full_group_by”错误。我直接从教程中复制了它并为他工作。我只需要在终端中禁用此模式吗?

    SELECT *
    FROM customers
    JOIN orders
            ON customers.id = orders.customer_id
    GROUP BY orders.customer_id;

如果启用 ONLY_FULL_GROUP_BY SQL 模式(默认情况下),MySQL 拒绝 select 列表 HAVING 的查询条件或 ORDER BY 列表指的是既未在 GROUP BY 子句中命名也不在功能上依赖于它们的非聚合列。 [1]

您可以禁用它,但启用它确实很有意义。考虑以下情况:

id | type
---|-----
1  | foo
2  | foo
3  | bar

如果您使用与 select * from table group by type 类似的查询,您希望输出结果是什么?也许您希望有两行,foobar,但是您希望在 id 列中包含什么,即 foo 记录?我们应该只选择最早的记录吗?最新记录?随机记录?这就是错误告诉您的内容 - 您必须明确说明,而不是让数据库引擎为您选择。

因此,在您的示例中,您需要考虑结果数据的外观。也许你想要 select customers.name, count(*) ... 而不是 select *,等等

这对您正在学习的教程有效的原因是他们没有启用 only_full_group_by,或者他们使用的 MySql 版本早于引入此功能的 5.7.5 .在这种情况下,服务器可以自由地从每个组中选择任何值,这可能不是您想要的。

最后,如果您希望控制台的行为方式与教程的行为方式相同,您可以通过以下方式在控制台中禁用 ONLY_FULL_GROUP_BY

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

[1] https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html