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

推薦する

Linux に ASPNET.Core3.0 ランタイムをインストールするためのサンプル コード

# 以下の例は x64 ビット ランタイム v3.0.0 用です mkdir /runtimes ...

CSS でよく使用されるフォントサイズ、フォント単位、行の高さの詳細な説明

px(ピクセル)ピクセルという言葉は皆さんもよくご存知だと思います。次に、この単位に関するちょっとし...

Dockerコンテナの中国語言語パックの設定の問題を解決する

Dockerでdocker search centosを使用する場合docker pull dock...

要素を中央に配置するための配置方法 (Web ページ レイアウトのヒント)

ブラウザウィンドウの中央に要素を配置する方法まず、コード ブロックを示します。すでにコードを理解して...

Linux ディスク パーティションの実装の原理と方法の分析

覚えて: IDE ディスク: 最初のディスクは hda、2 番目のディスクは hdb...最初のディ...

VMware IOInsight を使用して、仮想マシンのストレージ パフォーマンスの監視を改良する

例: VMware IOInsight は、VM のストレージ I/O 動作を理解するのに役立つツー...

MySQL バッチ挿入ループの詳細なサンプルコード

背景数日前、MySql でページングを行っていたときに、ページングに制限 0,10 を使用するとデー...

Nginx を使用してフロントエンドのクロスドメイン問題を解決する方法

序文Vue アプリケーションなどの静的ページを開発する場合、クロスドメインになる可能性のあるインター...

MySQL SHOW STATUSステートメントの使用

MySQL のパフォーマンス調整とサービス ステータスの監視を行うには、MySQL の現在の実行状態...

JavaScriptのプリコンパイルを見てみましょう(概要)

JSランニング三部作js実行コードは3つのステップに分かれています構文解析プリコンパイル解釈Jav...

Docker で MySQL クラスターを構築する方法の例

Docker の基本的な手順:アップデートパッケージ yum -y アップデートDocker仮想マシ...

JavaScript コードベースをよりクリーンにする 5 つの方法

目次1. 短絡や条件文の代わりにデフォルトのパラメータを使用する2. 複数の条件の処理3. スイッチ...

Linuxがすべてのコマンドをサポートしていない問題の解決策

Linux がすべてのコマンドをサポートしていない場合はどうすればいいですか?すべてのLinuxコマ...

MySQL ログトリガー実装コード

SQL文 ドロップトリガー もし sys_menu_edit が存在します。 各行のsys_menu...

コンピュータが予期せずシャットダウンした後、VMware で Linux がインターネットに接続できない問題の解決策

問題の説明: Linux システムのネットワーク カード ファイル /etc/sysconfig/n...