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:
 
   

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で実行するとエラーが発生せず、プログラムで実行するとエラーが発生します.
これはどの問題が問題の複雑さを引き起こしたのか,問題の原理を理解した後に根本的に解決することが最も直接的な案である.
よく自分に「太菜」かどうか聞いてみます.