Mysql を 5.7 にアップグレードした後のグループ クエリの問題を解決する

Mysql を 5.7 にアップグレードした後のグループ クエリの問題を解決する

問題を見つける

最近MySQLをMySQL 5.7にアップグレードした後、次のようなクエリでグループ化を実行すると、

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

次のエラーが報告されます:

SELECT リストは GROUP BY 句内になく、GROUP BY 句内の列に機能的に依存しない非集計列 'news.id' が含まれています。これは sql_mode=only_full_group_by と互換性がありません。

原因分析

その理由は、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

これはthis is incompatible with sql_mode=only_full_group_by 。完全なグループ化のみ、つまり、実行中に最初にグループ化し、次に照会されたフィールド (選択されたフィールド) に従ってグループ内のフィールドを取り出します。したがって、照会されたすべてのフィールドは、グループ化条件によってグループ化される必要があります。例外が 1 つあり、照会されたフィールドに集計関数が含まれている場合は、上記の count(id) と同様に、グループ化に含める必要はありません。

後で、並べ替え条件の「順序」フィールドもグループ化に含まれている必要があり、並べ替えフィールドもグループ化フィールドから取得されることが分かりました。 わからなかったら行って見てください。

解決:

1. 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';

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 が、有効であるとわかっているクエリを MySQL が判断できない理由で拒否する場合に便利です。関数の戻り値と型は、その引数の戻り値と型と同じですが、関数の結果は ONLY_FULL_GROUP_BY SQL モードではチェックされません。

上記のSQL文は次のように記述できます。

SELECT ANY_VALUE(id) as id、ANY_VALUE(uid) as uid、ANY_VALUE(username) as username、ANY_VALUE(title) as title、ANY_VALUE(author) as author、ANY_VALUE(thumb) as thumb、ANY_VALUE(description) as description、ANY_VALUE(content) as content、ANY_VALUE(linkurl) as linkurl、ANY_VALUE(url) as url、ANY_VALUE(group_id) as group_id、ANY_VALUE(inputtime) as inputtime、count(id) as count FROM `news` GROUP BY `group_id` ORDER BY ANY_VALUE(inputtime) DESC LIMIT 20

私は3番目の方法を選択しました。

要約する

上記はこの記事の全内容です。この記事の内容が皆さんの勉強や仕事に一定の参考学習価値を持つことを願っています。ご質問があれば、メッセージを残してコミュニケーションしてください。123WORDPRESS.COM を応援していただきありがとうございます。

以下もご興味があるかもしれません:
  • グループ統計のためにデータテーブルで groupby を使用する方法
  • グループ化された集計クエリには Sequelize の group by を使用する
  • MySQL の高度なクエリとコレクションによるグループ化の紹介
  • MySQL の分析: 単一テーブルを区別し、複数テーブルをグループ化して重複レコードを削除するクエリ
  • group by 統計をグループ化し、特定の期間でクエリを実行します (推奨)

<<:  Linux 編集の開始、停止、再起動の Springboot jar パッケージ スクリプトの例

>>:  ボタンの権限判定を実装するためのVueカスタムv-has命令

推薦する

Grafana+Prometheus を使用して MySQL サービスのパフォーマンスを監視する

Prometheus (プロメテウスとも呼ばれる) 公式サイト: https://prometheu...

MySQLデータをOracleに移行する正しい方法

mysql データベースには student テーブルがあり、その構造は次のとおりです。 Oracl...

Vueは画像のドラッグアンドドロップ機能を実装します

この記事の例では、画像のドラッグアンドドロップ機能を実現するためのVueの具体的なコードを参考までに...

CSS3 を使用した SVG パス ストロークのアニメーション化入門チュートリアル

JavaScript に依存せず、純粋な CSS を使用してsvgストローク描画アニメーション効果と...

JavaScript でカルーセル効果を実装する

この記事では、カルーセルの効果を実現するためのJavaScriptの具体的なコードを参考までに共有し...

Vueコンポーネントの作成方法と使用方法を説明する記事

目次1. コンポーネントとは何ですか? 2. グローバルコンポーネントを作成する方法1 1. Vue...

HTML と CSS を書くための 6 つの最も効果的な方法

この記事では、効率を向上させ、時間を節約することを願って、最も効果的な 6 つの方法を紹介します。 ...

VUEトークンの無効化プロセスの詳細な説明

目次ターゲット思考分析コード着陸要約するターゲットトークンの有効期限切れシナリオの処理トークンは、ユ...

MySQL の起動オプションとシステム変数の例の詳細な説明

目次ブートオプションコマンドラインパラメータの長い形式と短い形式設定ファイル構成グループシステム変数...

プライベートウェアハウス(レジストリとハーバー)を構築するためのDockerの実装

使用される Docker イメージが増えるにつれて、イメージを保存する場所、つまりウェアハウスが必要...

Linux の操作とメンテナンスの基本 httpd 静的 Web ページ チュートリアル

目次1. ウェアハウスを使用してhttpd lrzsz解凍ファイルを作成する2. ソースコードファイ...

CSS で実現される HTML 背景色のグラデーション

エフェクトのスクリーンショット:実装コード:コードをコピーコードは次のとおりです。 <!DOC...

水平プログレスバーの最後にテキストを表示するための実装コードの CSS 記述

問題の説明仕事で以下の成果を達成したいと考えています。 解決div タグに相対配置を追加し、絶対配置...

Expressはログイン認証を実装

この記事では、ログイン認証を実装するためのExpressの具体的なコードを例として紹介します。具体的...

MySQL インデックスの正しい使い方とインデックスの原理の詳細な説明

1. はじめになぜインデックスが必要なのでしょうか?一般的なアプリケーション システムでは、読み取り...