this is incompatible with sql_mode=only_full_group_by MySqlエラー

2083 ワード

昨日、プロジェクトでgroupbyを使用したsqlクエリ文がありましたが、開発環境でもテスト環境でも問題なく、結局オンラインインタフェースに着いたらダウンしてしまいました.mode=only_full_group_byこの間違い.
この間違いは私にとってはまだよく知っています.これは2回目のピットですから、1回目は半年前です.当時は修正したmysqlの配置で、それからでいいですが、今回はオンラインです.リーダーはオンラインの環境配置を修正することを許さず、sql文を修正するしかありません.
mysql 5.7でgroupbyを使用して処理しないと次のエラーが表示されます:this incompatible with sql_mode=only_full_group_by、これはmysqlがデフォルトでONLY_を有効にしているからですFULL_GROUP_BY.表示可能sql_model構成パラメータ.SELECT @@GLOBAL.sql_mode;
ソリューション:
1.ONLYを閉じるFULL_GROUP_BY、クライアント接続ツールで使用可能:set sql_mode ='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'; を行いますが、クライアントがこのコマンドを使用して閉じた後、接続ツールはgroupby文を使用できますが、プロジェクトでは使用できません.
2.mysqlプロファイルmyを変更します.ini(mysqlにこのファイルがなければmy-default.iniをmy.iniに変更します)
[mysqld]および[mysql]で追加
sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
3.利用ANY_VALUE()という関数は、次のようになります.
 @Select("SELECT " +
            " any_value(gmt_create) as gmt_create,source_name,any_value(source_id) as source_id ,any_value(SUM(count_sum)) as count_sum " +
            " FROM " +
            " inf_statistic_month " +
            " WHERE 1=1 " +
            "<if test='sourceId !=null'> " +
            " and source_id = #{sourceId} "+
            "</if>" +
            " And is_delete = 0 " +
            "<if test='startDate != null and endDate != null'>" +
            " AND gmt_create BETWEEN #{startDate} AND #{endDate}  " +
            "</if>" +
            " GROUP BY source_name , curr_year"+
            "<if test='orderBy !=null'> " +
            " ORDER BY ${orderBy} "+
            "</if>" +
            " limit #{offset},#{limit}")

注意any_valueの使い方:グループ化に関与しないクエリーのフィールドにany_を使用する必要があります.value()関数、any_value(gmt_create)as gmt_create、source_name、any_value(source_id)as source_id、any_value(SUM(count_sum))as count_sumを使用するany_value()の後にasでフィールドの名前を変更すると、エラーが発生します!!!