ONLY_FULL_GROUP_BY 模式和具有相同列名的表的非分组字段错误

Cou*_*les 6 mysql mysql-5.5 group-by mysql-5.6

我发现 MySQL 在ONLY_FULL_GROUP_BY启用模式时似乎有问题,并且查询包含 a HAVING,它指的是来自不同表的具有相同名称的分组列。

这是复制问题的架构:

CREATE TABLE t1 (c1 INT, c2 INT);
CREATE TABLE t2 (c1 INT, c2 INT);
Run Code Online (Sandbox Code Playgroud)

您需要添加ONLY_FULL_GROUP_BY到您的 SQL 模式:

SET SESSION SQL_MODE='STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION,ONLY_FULL_GROUP_BY'
Run Code Online (Sandbox Code Playgroud)

这是创建错误的查询:

SELECT t1.c1, t2.c1
FROM t1, t2
GROUP BY t1.c1, t2.c1
HAVING t1.c1 > 1 AND t2.c1 > 1;
Run Code Online (Sandbox Code Playgroud)

错误内容:

HAVING 子句中使用了非分组字段“c1”

双方t1.c1t2.c1进行分组,所以我看不出有什么不对这个查询。

此外,如果查询引用同一个表中的不同列名,则查询有效。例如:

SELECT t1.c1, t2.c2
FROM t1, t2
GROUP BY t1.c1, t2.c2
HAVING t1.c1 > 1 AND t2.c2 > 1;
Run Code Online (Sandbox Code Playgroud)

难道我做错了什么?我在任何地方都找不到有关此问题的报告。我可以在 Ubuntu 上的 MySQL 5.5.44 版和 Gentoo 上的 5.6.24 版上复制错误。

为此的 SQLFiddle - http://sqlfiddle.com/#!2/da2704/4

上面的简单查询只是为了演示这个问题。这是一个无法使用WHERE代替HAVING并遇到相同问题的版本:

... HAVING t1.c1 > SUM(t1.c2) AND t2.c1 > SUM(t2.c2)
Run Code Online (Sandbox Code Playgroud)

更新:

一个 MySQL 错误已被提出 - http://bugs.mysql.com/bug.php?id=80455

小智 3

这似乎是一个错误(MySQL 5.5 和 5.6)。一个有用的临时解决方案是:

SELECT `t1`.`c1`, `der`.`_c1`
FROM `t1`, (SELECT `c1` `_c1`, `c2` `_c2`
            FROM `t2`) `der`
GROUP BY `t1`.`c1`, `der`.`_c1`
HAVING `t1`.`c1` > 1 AND `der`.`_c1` > 1;
Run Code Online (Sandbox Code Playgroud)

SQL Fiddle 演示

在 MySQL 5.7.11 中,查询:

SELECT `t1`.`c1`, `t2`.`c1`
FROM `t1`, `t2`
GROUP BY `t1`.`c1`, `t2`.`c1`
HAVING `t1`.`c1` > 1 AND `t2`.`c1` > 1;
Run Code Online (Sandbox Code Playgroud)

运行流畅。