web-dev-qa-db-ja.com

ONLY_FULL_GROUP_BYモードおよび同じ列名を持つテーブルでの非グループ化フィールドエラー

ONLY_FULL_GROUP_BYモードが有効になっていて、クエリに同じ名前の異なるテーブルのグループ化された列を参照するHAVINGが含まれている場合、MySQLに問題があるようです。

これは問題を再現するためのスキーマです:

CREATE TABLE t1 (c1 INT, c2 INT);
CREATE TABLE t2 (c1 INT, c2 INT);

また、SQLモードにONLY_FULL_GROUP_BYを追加する必要があります。

SET SESSION SQL_MODE='STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION,ONLY_FULL_GROUP_BY'

そして、これはエラーを作成するクエリです:

SELECT t1.c1, t2.c1
FROM t1, t2
GROUP BY t1.c1, t2.c1
HAVING t1.c1 > 1 AND t2.c1 > 1;

エラー読み取り:

非グループ化フィールド 'c1'がHAVING句で使用されています

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;

私は何か間違ったことをしていますか?この問題の報告はどこにもありません。 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)

UPDATE:

MySQLバグが発生しました- http://bugs.mysql.com/bug.php?id=80455

6
Courtney Miles

バグのようです(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;

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;

スムーズに走ります。

3
wchiquito