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 結合テーブルと ID 自動増分の例の分析

結合の書き方左結合を使用する場合、左側のテーブルが必ず駆動テーブルになりますか? 2 つのテーブルの...

Typescriptを使用してローカルストレージをカプセル化する方法

目次序文ローカルストレージの使用シナリオ使用上の問題解決機能性有効期限を追加データ暗号化を追加する命...

ReactとReduxの配列処理の説明

この記事では、reduce()、filter()、map()、every()、some()、spre...

Linux ホスト上で複数の MySQL データベースを起動する方法

今日は、Linux ホスト上で 4 つの MySQL データベースを起動する方法について説明します。...

CSS を使用して複数の方法で等幅レイアウトを実装するサンプルコード

この記事で説明する等幅レイアウトでは、純粋な CSS を使用して、要素の幅を手動で設定することなく、...

Dockerコンテナの状態変換の実装

Dockerコンテナの状態遷移図2度目の実戦 [root@localhost ~]# docker ...

Nginx rtmp モジュールのコンパイル ARM バージョンの問題

目次1. 準備: 2. ソースコードのコンパイル1. 設定する2. コンパイルエラー3. ターゲット...

Linux centos7 環境での MySQL インストール チュートリアル

Linux centos7 環境に MySQL をインストールする手順の詳細な紹介MySQLをインス...

MySQL実行計画の詳細な分析

序文前回の面接では、実行計画について質問されたとき、多くの人がそれが何なのか知りませんでした。実行計...

JavaScriptはXiaomi Mall公式サイトの完全なページ実装プロセスを模倣します

目次1. ホームページ制作1. ダウンロードアプリの制作2. ナビゲーションバーの制作3. カルーセ...

MYSQL の binlog 最適化に関する考察の要約

質問質問 1: トランザクションをコミットするときに REDO ログをフラッシュすることによって発生...

Dockerイメージの階層化の原理の詳細な説明

ベースイメージベースイメージには 2 つの意味があります。他のイメージに依存せず、ゼロから構築します...

一般的な HTTP ステータス コード 10 個の詳細な説明

HTTP ステータス コードは、Web サーバーの HTTP 応答ステータスを示すために使用される ...

JavaScriptの厳密モードが8進数をサポートしていない問題の説明

JavaScript厳密モードが 8 進数をサポートしていないという問題に関して、まず、 Java...

Linux で killall コマンドを使用してプロセスを終了する 8 つの例

Linux コマンドラインには、プロセスを強制終了するためのコマンドが多数用意されています。たとえば...