【问题标题】:After upgrading to mysql 5.7.21: incompatible with sql_mode=only_full_group_by升级到mysql 5.7.21后:与sql_mode=only_full_group_by不兼容
【发布时间】:2018-03-14 11:55:54
【问题描述】:

5.7.20升级到mysql 5.7.21后出现错误

SELECT ac.vatcode_id,ac.vatcode_type,v.name vatcode_name,v.txt vatcode_txt
FROM `accounting` ac
LEFT JOIN `vatcode` v ON v.id=ac.vatcode_id
WHERE ac.account_id=300479 && ac.vatcode_id>=0 && ac.time BETWEEN 1514764800 AND 1546214400 && ac.block_id=4431
GROUP BY ac.vatcode_id

#1055 - SELECT 列表的表达式 #2 不在 GROUP BY 子句中,并且包含非聚合列 'dynaccount.ac.vatcode_type' 在功能上不依赖于 GROUP BY 子句中的列;这是 与 sql_mode=only_full_group_by 不兼容

# show variables;
sql_mode
STRICT_ALL_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

【问题讨论】:

  • 好吧,至少 DBMS 现在告诉你你的查询是无效的 SQL,这是一个很大的改进,不是吗?您按ac.vatcode_id 分组,但您的数据库不能保证每个ac.vatcode_id 只有一个ac.vatcode_type
  • 我不明白 :) 如何解决?

标签: mysql sql settings


【解决方案1】:

您的查询无效。你告诉 DBMS:“每个ac.vatcode_id 给我ac.vatcode_type”。 DBMS 告诉您,ac.vatcode_typeac.vatcode_id 没有;可以有多个不同的。那你想要哪个?最大值?然后制作这个MAX(ac.vatcode_type)。最低?然后将其设为MIN(ac.vatcode_type)。你不在乎哪个?然后制作这个ANY_VALUE(ac.vatcode_type)

您的新 MySQL 版本更加严格,并希望您编写符合 SQL 标准的有效查询。这是一件好事。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-12
    • 1970-01-01
    • 2020-02-29
    • 2016-10-03
    • 1970-01-01
    • 2018-03-12
    • 2018-04-13
    相关资源
    最近更新 更多