ページングのどのページでMySQLのレコードをクエリするか

ページングのどのページでMySQLのレコードをクエリするか

序文

実際には、次のような問題に遭遇する可能性があります。特定のレコードの ID がわかっていて、そのレコードが ID でソートおよびページ分けされている場合に、そのレコードがどのページにあるかを判断する必要があります。今日の記事はあなたにアイデアを提供します。

具体的な実装方法を見てみましょう。

IDでページング位置を照会する

ID に基づいてページング位置を照会するには、たとえば、ID が逆順に並べ替えられている場合、次の SQL を使用して、この ID より大きいレコードの数を照会できます。

id > 5 のユーザーから count(id) を選択します。

この例では、user はテーブル名と、一致させる 5 桁の ID です。当然、逆順にソートされているため、この ID より大きいレコードの数を見つけるだけで済みます。昇順でソートされている場合は、この ID より小さいレコードの数を見つけるだけで済みます。

カウント値を見つけた後、現在のレコードがどのページにあるかをどのように計算しますか? 以下は Java コードの例です。

ページサイズ = 10;
// 上記の結果が count で、値が 11 であると仮定します
整数カウント = 11;
// 現在のレコードのpageNumを計算します
// モジュラスに 1 を加えて、現在のページ番号をページ 2 として取得します。int pageNum = count/pageSize + 1;
// さらに特定のページ上の特定の位置を取得したい場合は、残りの部分、つまり2ページ目の最初のレコード(0から始まる)を取得できます。
int インデックス = count%ページサイズ;

多次元ソートと配置

上記の単純な ID によるソートは、比較的簡単に解決できます。レコードをソートする次元が ID だけではない場合はどうでしょうか。たとえば、最初に年齢で逆順にソートします。年齢が同じ場合は、ID で続いて逆順にソートします。基本的な SQL ステートメントは次のとおりです。

ユーザーから id、age を age desc、id desc で並べ替えて選択します。

この時点で、ID が 5、年齢が 18 のレコードがあることがわかります。複数条件の並べ替えでこのレコードの位置をどのように決定するのでしょうか。

まず、複数条件ソートの難しさは、年齢が同じ場合にあります。年齢が異なる場合は、「ID に基づいてページング位置を照会する」と同様に、次の SQL を使用して ID の位置を特定できます。

年齢が18を超えるユーザーからcount(id)を選択します。

この方法では、組み合わせたソート年齢が異なる場合に、このレコードの位置を照会できます。特定の位置のアルゴリズムは、最初のケースと同じです。

では、年齢を重ねた場合、どのように対処すればよいのでしょうか?もちろん、これは複雑な関連クエリやサブテーブル クエリを通じて実現できます。別の方法として、現在のユーザーと同じ年齢で ID が大きいレコードの数をクエリする方法もあります。

age = 18 かつ id > 5 のユーザーから count(id) を選択します。

上記では、年齢が同じで ID が 5 より大きいレコードを取得します。最初のステップと 2 番目のステップの統計結果を追加します。問題は、「ID に基づいてページング位置を照会する」という単純なモードに戻ったのか、それとも同じアルゴリズムで現在のレコードがどのページにあるかを計算できるのかということです。

このソリューションはデータベースを 2 回クエリしますが、インデックスが適切に確立されている場合は、関連クエリやサブクエリよりも便利で簡潔かつ効率的です。

まとめ

上記は、実際に同様の問題に遭遇したときの 2 つの考え方です。これらが皆さんの突破口となることを願っています。また、皆さんがより良い解決策を提供できることを願っています。

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

以下もご興味があるかもしれません:
  • MySQLのサブクエリユニオンの効率性についての簡単な説明と
  • MySQL マルチテーブルジョイントクエリ効率の詳細な分析と最適化
  • いくつかのMySQLジョイントクエリの一般的な説明
  • MySQL ジョイントクエリ UNION と UNION ALL の使用法の紹介
  • MySQL のジョイント クエリで UNION と Order by を使用する際のエラー問題の解決方法
  • MySQLのマルチテーブルジョイントクエリはテーブル実装コードの内容を返します
  • MySQL で 2 つのテーブルをクエリする場合の from と join の違いの概要
  • Mysqlは実行中のトランザクションを照会し、ロックを待機する方法
  • MySQL クエリにおける LIMIT の大きなオフセットによって引き起こされるパフォーマンス低下の分析
  • Mysql の 2 つのテーブル間の結合クエリの 4 つの状況の概要

<<:  CentOS 7 で Python を 3.6.6 にアップグレードした後に発生する yum エラー問題の解決方法の概要

>>:  ElementUI ページネーション コンポーネントの使い方 Vue でのページネーション

推薦する

Nexus をベースに Alibaba Cloud プロキシ ウェアハウスを構成するプロセスの分析

Nexus のデフォルトのリモートリポジトリは https://repo1.maven.org/ma...

JavaScript でシンプルなタイマーを実装する

この記事では、参考までに簡単なタイマーを実装するためのJavaScriptの具体的なコードを紹介しま...

良いリファクタリングを行うには、コードをリファクタリングするだけでなく、人生をリファクタリングすることも重要です。

職業的な観点からも、人生の観点からも、良い再建をすることは本当に簡単ではありません。楽観的で熱心で前...

MySQLからOracleへのリアルタイム同期ソリューションの詳細な説明

1 要件の概要MySQL5.6本番データベースの複数のテーブルのデータは、Oracle11gデータウ...

デジタル時計効果を実現するJavaScript

この記事の例では、JavaScriptでデジタル時計効果を実装するための具体的なコードを参考までに共...

JavaScriptはeコマースプラットフォームの製品詳細を実装します

この記事では、電子商取引プラットフォームで商品の詳細を表示する一般的な例を紹介します。たとえば、ある...

Linux で Redis のリモート接続を実装する方法

LinuxにRedisをインストールしたら、Javaを使って接続します。Javaコードは次のとおりで...

Dockerfile テキストファイルの使用例の分析

Dockerfile は、イメージをビルドするために使用されるテキスト ファイルです。テキスト コン...

MySQLの誤操作後にbinlog2sqlを使用して素早くロールバックする方法の詳細な説明

序文日常の仕事や勉強では、データベースを操作するときに「不注意」によるミスを犯すことは避けられません...

MySQL マスタースレーブレプリケーションスレッドの状態遷移に関する詳細な理解

序文MySQL マスター スレーブ レプリケーションの基本原理は、スレーブ データベースがマスター ...

MySql テーブル、データベース、シャーディング、パーティショニングの知識ポイントの紹介

1. はじめにデータベース内のデータ量が一定レベルに達すると、システムパフォーマンスのボトルネックを...

MySQL で誤って削除したテーブル データを回復する方法 (必読)

バックアップがあれば、非常に簡単です。最新のバックアップ データを生成し、mysqlbinlog を...

JavaScript 型検出方法の例のチュートリアル

序文JavaScriptはWebフロントエンドで広く使われている言語の一つであり、Webアプリケーシ...

Javascriptでオブザーバーモードを実装する方法を教えます

目次オブザーバーパターンとは何ですか?シナリオシミュレーションコードの実装コードのリファクタリング要...

image/x-png の ContentType について

これにより、png ファイルのアップロードも不可能になりました (後で情報を調べたところ、レジストリ...