mysql group byエラー、only_full_group_by 3つのソリューション
6253 ワード
エラーメッセージ
Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'database.table.column' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
翻訳するとgroup byのところにはいくつかの列が含まれていません
具体的な問題は具体的に分析して、私のここの問題は:selectの時TIMESTAMPDIFFの中の2つの列名を使ってgroupbyの中で含まれていません
mysql 5.7以降のバージョンデータベースのデフォルトモードは
only_full_group_byモード、実行するsqlの中でいくつか重複する行group byがある時mysqlはどの行を選ぶことを知りません
エラー・インスタンス
1:
ソリューション:
1:any_の使用value()には、mysqlが特定のカラムとどのカラムに葛藤しないように、特定のプロンプトのカラム名が含まれます.
2:sql_をmodeを非only_に変更full_group_byモード(開発したばかりのプロジェクトで、プロジェクトについて深く理解した後、実行可能性分析を行ってから変更し、一般的には提案しません)
3:sqlを最適化し、各パケットの要素に対してmysqlがどのように選択する必要があるかを明確に通知する
成功した書き方:
1:
2:
分析の終了:
groupbyの問題がおかしいのは5.7のmysqlバージョンの改版です.bugの出現は偶発性を有する.mysql clientで実行するとエラーが発生せず、プログラムで実行するとエラーが発生します.
これはどの問題が問題の複雑さを引き起こしたのか,問題の原理を理解した後に根本的に解決することが最も直接的な案である.
よく自分に「太菜」かどうか聞いてみます.
Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'database.table.column' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
翻訳するとgroup byのところにはいくつかの列が含まれていません
具体的な問題は具体的に分析して、私のここの問題は:selectの時TIMESTAMPDIFFの中の2つの列名を使ってgroupbyの中で含まれていません
mysql 5.7以降のバージョンデータベースのデフォルトモードは
only_full_group_byモード、実行するsqlの中でいくつか重複する行group byがある時mysqlはどの行を選ぶことを知りません
エラー・インスタンス
1:
SELECT
ifnull( sum( checkTime ) / count( 1 ), 0 ) AS time
FROM
( SELECT TIMESTAMPDIFF( MINUTE, CreateTime, EndTime ) AS checkTime FROM statistics_report WHERE AND ReportStatus = 2 GROUP BY reportid ) a
2:
SELECT
ifnull( sum( treatmentTime ) / count( 1 ), 0 ) AS time
FROM
(
SELECT
TIMESTAMPDIFF( MINUTE, min( CreateTime ), max( EndTime ) ) AS treatmentTime
FROM
statistics_report
WHERE
CreateTime > ? SartTime
AND CreateTime < ? EndTime
AND IsReportOperate = 2
AND createtime <> endtime
GROUP BY
reportid
) a
ソリューション:
1:any_の使用value()には、mysqlが特定のカラムとどのカラムに葛藤しないように、特定のプロンプトのカラム名が含まれます.
2:sql_をmodeを非only_に変更full_group_byモード(開発したばかりのプロジェクトで、プロジェクトについて深く理解した後、実行可能性分析を行ってから変更し、一般的には提案しません)
3:sqlを最適化し、各パケットの要素に対してmysqlがどのように選択する必要があるかを明確に通知する
成功した書き方:
1:
SELECT
ifnull( sum( checkTime ) / count( 1 ), 0 ) AS time
FROM
( SELECT TIMESTAMPDIFF( MINUTE, CreateTime, EndTime ) AS checkTime, reportid FROM statistics_report WHERE ReportStatus = 2 ) a
GROUP BY
reportid
-- group by , , ,checkTime sum , 。
2:
SELECT
ifnull( sum( timestampdiff( MINUTE, starttime, endtime ) ) / count( 1 ), 0 ) AS time
FROM
(
SELECT
min( createtime ) starttime,
max( endtime ) endtime,
reportid
FROM
statistics_report
WHERE
CreateTime > ? SartTime
AND CreateTime < ? EndTime
AND IsReportOperate = 2
AND createtime <> endtime
GROUP BY
reportid
) a
-- timestampdiff min max , group by ; timestampdiff , reportid 。
-- ifnull null
分析の終了:
groupbyの問題がおかしいのは5.7のmysqlバージョンの改版です.bugの出現は偶発性を有する.mysql clientで実行するとエラーが発生せず、プログラムで実行するとエラーが発生します.
これはどの問題が問題の複雑さを引き起こしたのか,問題の原理を理解した後に根本的に解決することが最も直接的な案である.
よく自分に「太菜」かどうか聞いてみます.