Mysql は非集計列を選択できません

Mysql は非集計列を選択できません

1. はじめに

最近ブログをアップグレードし、記事ページの下部に前の記事と次の記事に直接ジャンプできるボタンを 2 つ追加しました。

次の図に示すように:

この関数を実装する際の難しさは、データベースがレコードの前後の 2 つの隣接するレコードをどのように選択するかにあります。

2. データベース設計

私の記事データベースの設計は以下の通りです。

ご覧のとおり、各レコードの ID はインデックス ID です。以前に多くの記事レコードが削除されたため、ID は連続していません。

現在の記事のインデックス値が 33 の場合、次のコマンドを使用して 2 つの隣接する記事を取得できます。

IDが次のパスから*を選択
(選択
場合
SIGN(id - 32)>0のとき、MIN(id)
SIGN(id - 32 )<0 の場合、 MAX(id)
終わり
通路から
id != 34 の場合
GROUP BY SIGN(id - 32) でグループ化
符号による順序(id - 32)
)
ID で並べ替える;

3. 集計列を選択できない

上記のコマンドを実行すると、Mysql から次のエラーが発生しました: SELECT list is not in GROUP BY clause ... Google から聞いたところ、MySQL 5.7 以降ではonly_full_group_byがデフォルトで有効になっており、MySQL は選択リスト、条件、またはシーケンス リストによって参照されるクエリを拒否することがわかりました。

原文は次のとおりです。

選択リスト、HAVING 条件、または ORDER BY リストが、GROUP BY 句で名前が指定されておらず、GROUP BY 列に機能的に依存していない (GROUP BY 列によって一意に決定されていない) 非集約列を参照するクエリを拒否します。MySQL 5.7.5 以降、デフォルトの SQL モードには ONLY_FULL_GROUP_BY が含まれています。(5.7.5 より前では、MySQL は機能的依存関係を検出せず、ONLY_FULL_GROUP_BY はデフォルトで有効になっていません。5.7.5 より前の動作の説明については、MySQL 5.6 リファレンス マニュアルを参照してください。)

したがって、 only_full_group_byオプションが含まれないように sql_mode を設定する必要があります。 MySQL 5.7.5 以降では、only_full_group_by が sql_mode のデフォルト オプションの 1 つになり、一部の SQL ステートメントが失敗する可能性があります。

mysql 設定ファイルに入り、[mysqld] セクションに次の設定を追加して、mysql を再起動します。

[mysqld]
# ... その他の設定
sql_mode = STRICT_TRANS_TABLES、NO_ZERO_IN_DATE、NO_ZERO_DATEERROR_FOR_DIVISION_BY_ZERO、NO_AUTO_CREATE_USER、NO_ENGINE_SUBSTITUTION # 'only_full_group_by' を削除します
# ... その他の設定

この記事の後半の mysql コマンドを実行すると、結果は次のようになります。

4. 関連リンク

完全グループ化のみ

要約する

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

以下もご興味があるかもしれません:
  • MySQL の集計関数 count の使用法とパフォーマンスの最適化テクニック
  • MySQLでよく使われる集計関数の詳細な説明
  • MySql の集計関数に条件式を追加する方法
  • php+mysql オープンソース XNA 集計プログラムがダウンロード用にリリースされました
  • MySQL の単一テーブル クエリ操作例の詳細な説明 [構文、制約、グループ化、集計、フィルタリング、並べ替えなど]
  • MySQL クエリのソートとクエリ集計関数の使用法の分析
  • MySQLは集計関数を使用して単一のテーブルをクエリします
  • MySQL グループ化クエリと集計関数
  • MySQL 継続的集計の原理と使用法の分析
  • MySQL 集計統計データの低速クエリの最適化

<<:  Linux で nohup ログ出力が大きすぎる問題の解決方法の詳細な説明

>>:  Linux ドメイン ネーム サービス DNS 設定方法

推薦する

MySQL デッドロックのトラブルシューティングの全プロセス記録

【著者】 Liu Bo: Ctrip テクニカル サポート センターのシニア データベース マネージ...

スクリプトを使用して、ワンクリックでDockerイメージをパッケージ化してアップロードします。

著者は1年以上マイクロフロントエンドプロジェクトに取り組んできました。チームは10個のマイクロアプリ...

JavaScript配列の一般的なメソッドの例のまとめ

目次一般的な配列メソッドconcat() メソッドjoin() メソッドpop() メソッドpush...

CSS設定div背景画像実装コード

コンポーネントに背景画像コントロールを追加するには、次の 2 つの手順だけが必要です。 <表示...

MySQLトリガーの簡単な使用例

この記事では、例を使用して MySQL トリガーの簡単な使用方法を説明します。ご参考までに、詳細は以...

HTML テキストエスケープのヒント

今日、CSDN で HTML テキスト エスケープのちょっとしたトリックを見ましたが、とても簡単です...

単一の Nginx IP アドレスに複数の SSL 証明書を設定する例

デフォルトでは、Nginx は IP アドレスごとに 1 つの SSL 証明書のみをサポートします。...

Vue3 でサードパーティのコンポーネントライブラリをオンデマンドでロードする方法

序文Element Plus を例に、コンポーネントとスタイルのオンデマンド読み込みを構成します。環...

JavaScriptはスクロールバーの位置を取得し、ページをアンカーポイントまでスライドします。

序文この記事は、私が最近仕事で遭遇した問題を記録したものです。アプリネイティブとフロントエンドのh5...

CSS でのフィルタープロパティの使用に関する詳細な説明

フィルター属性は要素の視覚効果を定義しますぼかし画像にガウスぼかしを適用します。 「半径」の値は、ガ...

Vue で変数式セレクターを実装する方法

目次HTML構造の定義入力タグのバインディング属性入力タグはキーダウンイベントをリッスンしますli ...

MySQL Shellの紹介とインストール

目次01 レプリ​​カセットアーキテクチャ02 MySQL Shellの紹介とインストール03 My...

nginx を使用して同じドメイン名で複数の Vue プロジェクトをデプロイし、リバース プロキシを使用する方法

効果現在、プロジェクトは2つ(project1、project2)あり、nginxに付属するinde...

Vueはログインジャンプを実装する

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

Ubuntu インストール時にブラックスクリーンが表示される場合の解決策 (3 種類)

私のコンピューターのグラフィック カードは Nvidia グラフィック カードです。再起動後、画面に...