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 設定方法

推薦する

Centos6.6 で php7 + nginx 環境をインストールする方法

この記事では、centos6.6 で php7 + nginx 環境をインストールする方法について説...

Dockerコンテナを使用してプロキシ転送とデータバックアップを実装する方法

序文アプリケーションを Docker コンテナとしてサーバーにデプロイする場合、通常はネットワークと...

MySQL における楽観的ロックと悲観的ロックの例

データベース管理システムにおける同時実行制御のタスクは、データベース内の同じデータに同時にアクセスす...

クリーンで美しいウェブデザインのための4つの原則

この記事では、 Webデザインに関連するこれら4 つの原則について説明します。これら4 つの原則を念...

ウェブデザインにおけるポップアップウィンドウとフローティングレイヤーのデザイン

従来のソフトウェアから Web ウェアへの段階的な移行の傾向の中で、デザイン パターンとテクノロジは...

Adobe Brackets の簡単な使い方のグラフィックチュートリアル

Adobe Brackets は、HTML、CSS、JavaScript 用のオープンソースでシンプ...

MySQL 文字セットの表示と変更のチュートリアル

1. 文字セットを確認する1. MYSQLデータベースサーバーとデータベースの文字セットを確認する方...

MySQL Null は 5 つの問題を引き起こす可能性があります (すべて致命的)

目次1. カウントデータが失われる解決2. 明確なデータ損失3.データ損失を選択解決4. Nullポ...

一般的なDocker Composeコマンドの詳細な説明

1. Docker Compose の使用方法は docker コマンドの使用方法と非常に似ています...

Ubuntu システムにおける Mysql ERROR 1045 (28000): ユーザー root@localhost へのアクセスが拒否される問題の解決方法

最初の方法: skip-grant-tables: 非常に便利なmysql起動パラメータ非常に便利な...

Js でオブジェクトのディープ オブジェクトを安全に取得するメソッドの例

目次序文文章パラメータ例Lodash 実装:トーキー機能: castPath関数: stringTo...

Ace をベースにした Markdown エディターを共有する

エディターは 2 つのカテゴリに分かれていると思います。1 つは、即時レンダリングを実現するために左...

Firefox で Flash を再生するためのオブジェクトとパラメータの書き方

コードをコピーコードは次のとおりです。 <object classid="clsid...

MySQL でスロークエリログを有効にする方法

1.1 はじめにスロークエリログを有効にすると、MySQL は指定された時間を超えるクエリステートメ...

JavaScript 関数のコンテキストのルールは何ですか?

目次1. ルール 1: Object.Method() 1.1 ケース1 1.2 ケース2 1.3 ...