こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

MysqlのONLY_FULL_GROUP_BY

MySQLの5.7.9でONLY_FULL_GROUP_BYを有効にしています。
3つのテーブル(a, b, m) を結合して以下のようにgroup byした際、with rollupを付けるとエラーになります。rollup なしでは通ります。これは正しい挙動でしょうか。

select a.aid, a.name, b.bid, sum(m.value)
from a inner join b on a.aid = b.aid
inner join m on m.bid = b.bid
group by a.aid, b.bid

a.aid, b.bid はいずれもprimary keyです。
with rollup時のエラーは"SELECT list is not in GROUP BY clause and contains nonaggregated column a.name functionally dependent on columns in GROUP BY clause"という内容ですが、a.nameはテーブルの定義上a.idによって一意に決まる値です。

投稿日時 - 2015-11-30 22:46:44

QNo.9088668

暇なときに回答ください

このQ&Aは役に立ちましたか?

2人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.2

No1です。

> with rollupなしのgroup by --> エラーなし
> with rollupありのgroup by --> エラー発生

申し訳ありません。
おっしゃられるとおりONLY_FULL_GROUP_BYが有効なら上記2つのパターンのどちらの場合でもエラーになってしまう気がしますが、この動作が正常なのかはまだ判断できませんでした(明確な回答になっておらず申し訳ありません)。

投稿日時 - 2015-12-02 10:38:04

ANo.1

正しい動作のように思います。

https://dev.mysql.com/doc/refman/5.7/en/group-by-modifiers.html

MySQLのGROUP BY句では名前が指定されていない非集約カラムを参照できないように仕様拡張されていますが、with rollupもこの範囲に含まれているように思え、ONLY_FULL_GROUP_BY SQLモードが有効な場合はその仕様拡張機能が無効になるため、記載いただいたようなSQLはエラーとなるのではないかと思います。

投稿日時 - 2015-12-01 14:38:14

補足

ありがとうございます。
理解できているか怪しいのですが、ご説明の内容は with rollupの有無によらずエラーになる、ということではないのでしょうか。起きている事象は、
with rollupなしのgroup by --> エラーなし
with rollupありのgroup by --> エラー発生
なのですが、正しい動作でしょうか。

投稿日時 - 2015-12-01 20:09:48