web-dev-qa-db-ja.com

エラーコード:1055はsql_mode = only_full_group_byと互換性がありません

Lahman SQL野球データベースのオフラインバージョンへの切り替えで問題が発生しました。 EDXコースに埋め込まれたターミナルを使用していました。このコマンドは、Webターミナルで正常に実行されます。

SELECT concat(m.nameFirst,concat(" ",m.nameLast)) as Player,
    p.IPOuts/3 as IP,
    p.W,p.L,p.H,p.BB,p.ER,p.SV,p.SO as K,
    p.IPOuts+p.W*5+p.SV+p.SO-p.BB-p.L-p.H as PTS,
    p.yearID as Year
FROM Pitching p
Inner Join Master m
    ON p.playerID=m.playerID
WHERE p.yearID=2014 AND p.IPOuts>=50
GROUP BY m.playerID
ORDER BY PTS DESC;

これはSQL 5.5.46を実行していますが、5.7.10を実行しているオフラインバージョンを使用すると、次のエラーコードが表示されます。

エラーコード:1055。SELECTリストの式#1はGROUP BY句に含まれておらず、GROUP BY句の列に機能的に依存しない非集計列 'stats.m.nameFirst'が含まれています。これはsql_mode = only_full_group_byと互換性がありません

私は人々の問題に対する多くの解決策を読んできましたが、この場合彼らは助けにはなりませんでした。それは前に起こったことがないので、これは非常に明白であるか、おそらくコーディングで大丈夫だと思います。とにかく、誰でもこれを修正する方法を知っていますか?

16
Frydaddy07

5.7では、sqlmodeはデフォルトで次のように設定されます。

 ONLY_FULL_GROUP_BY,NO_AUTO_CREATE_USER,STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION

ONLY_FULL_GROUP_BY句を削除するには、次のようにします。

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

これは、集約されていない列を使用してGROUP BYを作成する必要があることを前提としています。

よろしく

43
White Feather

上記の受け入れられた解決策は、バージョン5.7.9, for osx10.9 (x86_64)では機能しませんでした。

その後、以下が働いた-

set global sql_mode = 'STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
25
Anis

他のユースケースの場合:_ONLY_FULL_GROUP_BY_を無効にする必要は必ずしもありません。mysqlのドキュメントによれば、「このクエリは、nameがtの主キーまたは一意のNOT NULL列でない場合は無効です。この場合、機能的な依存関係は推測できず、エラーが発生します。 "

_SELECT name, address, MAX(age) FROM t GROUP BY name;
ERROR 1055 (42000): Expression #2 of SELECT list is not in GROUP
BY clause and contains nonaggregated column 'mydb.t.address' which
is not functionally dependent on columns in GROUP BY clause; this
is incompatible with sql_mode=only_full_group_by
_

代わりに、このANY_VALUE('my_column_name') my_column_nameを使用できます。「この場合、MySQLは各名前グループ内のアドレス値の非決定性を無視し、クエリを受け入れます。」 ANY_VALUE()を使用して、アドレスを参照します。

_SELECT name, ANY_VALUE(address), MAX(age) FROM t GROUP BY name;
_
6
phil