29

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 と互換性がありません

私は人々の問題に対する多くの解決策を読んできましたが、この場合は役に立ちませんでした. これは今までになかったので、これは非常に明白であるか、コーディングに慣れているのかもしれません。とにかく、誰もこれを修正する方法を知っていますか?

4

8 に答える 8

70

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 を作成する必要があると想定しています。

よろしく

于 2016-03-24T18:35:40.200 に答える
36

上記の受け入れられた解決策は、 version では機能しませんでした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';
于 2016-12-18T09:53:20.033 に答える
11

他のユース ケースの場合: 必ずしも無効にする必要はありONLY_FULL_GROUP_BY ません機能依存性が推測でき、エラーが発生します:"

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

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

SELECT name, ANY_VALUE(address), MAX(age) FROM t GROUP BY name;
于 2018-04-28T17:42:53.563 に答える