偶然にも、SQL ステートメントを異なる MySQL インスタンスで実行すると、異なる結果が生成されることがわかりました。 問題の説明ビジネス シナリオをシミュレートするために、製品テーブル product_tbl と製品操作記録テーブル product_operation_tbl の 2 つのテーブルを作成します。構造とデータは次のとおりです。 次に、次のステートメントを使用して、すべての製品の最新の変更時刻を照会する必要があります。 product_tbl から t1.id、t1.name、t2.product_id、t2.created_at を選択し、t1 を左結合します (product_operation_log_tbl から * を選択し、created_at desc で順序付けします)。t2 を t1.id = t2.product_id でグループ化し、t1.id でグループ化します。 結果から、サブクエリは最初に product_operation_log_tbl 内のすべてのレコードを作成時刻 (created_at) の逆順に並べ替え、次にそれらを product_tbl と結合して製品の最新の変更時刻を調べていることがわかります。 リージョン A の MySQL インスタンスでは、製品の最新の変更時刻をクエリすると正しい結果が得られます。ただし、リージョン B の MySQL インスタンスでは、取得される変更時刻は最新ではなく、最も古いものになります。ステートメントを簡略化することで、サブクエリ内の order by created_at desc ステートメントがリージョン B のインスタンスでは効果がないことがわかりました。 トラブルシューティングのプロセスリージョンが MySQL の動作に影響を与える可能性はありますか? DBA 調査の結果、エリア A の MySQL はバージョン 5.6、エリア B の MySQL はバージョン 5.7 であることが判明し、次の記事が見つかりました。 https://blog.csdn.net/weixin_42121058/article/details/113588551 記事の説明によると、MySQL バージョン 5.7 ではサブクエリ内の order by ステートメントが無視されるとのことです。しかし、不可解なのは、ビジネス シナリオをシミュレートするために使用した MySQL バージョンが 8.0 であり、この問題は発生しないことです。 Docker を使用して MySQL 5.6、5.7、8.0 インスタンスをそれぞれ起動し、上記の操作を繰り返します。結果は次のとおりです。 ご覧のとおり、サブクエリ内の order by を無視するのは MySQL バージョン 5.7 のみです。 5.7 でバグが発生し、それ以降のバージョンで修正された可能性はありますか? 問題の根本原因ドキュメントと情報の検索を続けると、公式フォーラムで次の説明を見つけました。
問題の原因は明らかです。SQL 標準では、テーブルの定義はソートされていないデータ セットであり、SQL サブクエリは一時テーブルであることが判明しました。この定義によると、サブクエリ内の order by は無視されます。同時に、公式の回答では、サブクエリの order by を最も外側の SELECT ステートメントに移動する、という解決策も示されました。 要約するSQL 標準では、サブクエリ内の order by は無効です。 MySQL 5.7では現時点でSQL標準に準拠しているため問題が露呈しているが、この書き方はMySQL 5.6/8.0でも有効である。 MySQL サブクエリで order by が有効にならない問題についての記事はこれで終わりです。MySQL サブクエリの order by が有効にならないことに関する関連コンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。 参照ドキュメントhttps://stackoverflow.com/questions/26372511/mysql-mariadb-order-by-inside-subquery https://mariadb.com/kb/en/why-is-order-by-in-a-from-subquery-ignored/ 以下もご興味があるかもしれません:
|
<<: IE6/7 で絶対配置された要素が不可解に消えたりブロックされたりする問題を解決する方法
>>: Vueはローカルストレージの追加、削除、変更機能を実装します
目次一般的な配列メソッドポップ()シフト解除()シフト()スライス()スプライス()配列から重複した...
コードをコピーコードは次のとおりです。 <iframe src="1.htm&quo...
序文add_header は、headers モジュールで定義されたディレクティブです。名前が示すよ...
この記事では、例を使用して、MySQL の継続的な集計の原理と使用方法を説明します。ご参考までに、詳...
Discuz! フォーラムにはバックグラウンドで多くの設定オプションがあり、これらの設定オプションを...
この記事では、以下の環境をテストします。 CentOS 7 64 ビット 最小 MySQL 5.7 ...
Mysql マスタースレーブ同期の Last_IO_Errno:1236 エラーの原因は何ですか? ...
開発の過程では、インスタンスの vm.$refs(this.$refs) を使用して、ref で登録...
問題の説明私たちのプロジェクトでは、水平方向のテーブルが一般的ですが、必要に応じて垂直方向のテーブル...
Linux バージョンに関する情報を表示および解釈するのは、見た目よりも少し複雑です。単純なバージョ...
mysql 8.0.11 winx64のインストールチュートリアルは以下のように記録され、みんなと共...
赤い封筒の揺れ効果を実現するには要件があります。これまでやったことがないので、記録しておきます。ヘヘ...
Vue データの双方向バインディング原則ですが、この方法には欠点があり、配列とオブジェクトの部分的な...
目次1. Ubuntuソースの変更2. MySQLをインストールする3. 新しいユーザーを作成し、権...
目次背景成し遂げる1. カプセル化された /utils/dialogControl.js 2.ダイア...