ホームページ >データベース >mysql チュートリアル >Mysql5.7 のクエリによるグループの問題の解決策を共有する

Mysql5.7 のクエリによるグループの問題の解決策を共有する

黄舟
黄舟オリジナル
2017-09-14 11:38:232274ブラウズ

この記事では主に、Mysql を 5.7 にアップグレードした後に発生するクエリによるグループの問題の解決策をサンプル コードを通じて詳しく紹介します。この問題に遭遇した友人にとっては、一定の参考と学習価値があります。必要な場合は、エディターをフォローして一緒に学習してください。

問題が見つかりました

最近、mysql を mysql 5.7 にアップグレードした後、次のようなクエリによるグループ化を実行すると、次のようなエラーが報告されます:


SELECT *, count(id) as count FROM `news` GROUP BY `group_id` ORDER BY `inputtime` DESC LIMIT 20

原因分析

原因はmysql 5.7モードにあります。 ONLY_FULL_GROUP_BY はデフォルトで有効になっています。 ONLY_FULL_GROUP_BY は MySQL が提供する sql_mode であり、SQL ステートメント GROUP BY の有効性をチェックするために使用されます。

http://dev.mysql.com/doc/refman/5.7/en/sql-mode.html#sqlmode_only_full_group_by

これは sql_mode=only_full_group_by と互換性がありませんこの文はこの違反を促します。 MySQL のルールでは、完全にグループ化するだけです。つまり、グループは実行中に最初にグループ化され、クエリのフィールド (フィールドの選択) はグループのコンテンツから取り出されるため、クエリのすべてのフィールドは次のようになります。 group by グループ化条件内; 例外として、クエリ フィールドに集計関数が含まれている場合は、上記の count(id) と同様に、group by に含める必要はありません。

後で、並べ替え条件による並べ替えのフィールドもグループ化する必要があり、並べ替えフィールドもグループ化されたフィールドから取得されることがわかりました。 わからない場合は見てもいいでしょう。

this is incompatible with sql_mode=only_full_group_by这句话提示了这违背了mysql的规则,only fully group by,也就是说在执行的时候先分组,根据查询的字段(select的字段)在分组的内容中取出,所以查询的字段全部都应该在group by分组条件内;一种情况例外,查询字段中如果含有聚合函数的字段不用包含在group by中,就像我上面的count(id)。

后来发现Order by排序条件的字段也必须要在group by内,排序的字段也是从分组的字段中取出。 不明白的可以去看一下。

解决办法:

1.set@@sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_pISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';

去掉ONLY_FULL_GROUP_BY即可正常执行sql.

2. 不去ONLY_FULL_GROUP_BY, 时 select字段必须都在group by分组条件内(含有函数的字段除外)。(如果遇到order by也出现这个问题,同理,order by字段也都要在group by内)。

3.利用ANY_VALUE()

解決策:

1.set@@sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_pISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION' ;


SQL を通常に実行するには、ONLY_FULL_GROUP_BY を削除します。

2 ONLY_FULL_GROUP_BY を使用しない場合、すべての選択フィールドはグループ化条件内にある必要があります (関数を含むフィールドを除く)。 (この問題は、order by が発生した場合にも発生します。同様に、order by フィールドも group by 内にある必要があります)。

3. ANY_VALUE() 関数を使用します https://dev.mysql.com/doc/refman/5.7/en/miscellaneous-functions.html#function_any-valueこの関数は便利ですONLY_FULL_GROUP_BY SQL モードが有効な場合の GROUP BY クエリの場合、MySQL が判断できない理由で有効であることがわかっているクエリが拒否された場合、関数の戻り値と型がその引数の戻り値と型と同じです。ただし、ONLY_FULL_GROUP_BY SQL モードでは関数の結果はチェックされません。たとえば、上記の SQL ステートメントは次のように記述できます

🎜🎜🎜
SELECT list is not in GROUP BY clause and contains nonaggregated column ‘news.id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by.
🎜私は 3 番目の方法を選択しました。 🎜🎜🎜🎜概要🎜🎜🎜

以上がMysql5.7 のクエリによるグループの問題の解決策を共有するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。