


[共有] mysqlベースのページングプログラムの完全なソリューション(通常のページング/セグメント化されたページング/オリジナルのページング/weiboのsince_idタイプのページングを含む)
[共有] mysqlベースのページングプログラムの完全なソリューション(Weiboの通常のページング/セグメント化されたページング/オリジナルのページング/since_idタイプのページングを含む)
この記事のブログアドレス: http://blog.csdn.net/lgg201/article /details/7757494
この記事に含まれるソース コードは、http://download.csdn.net/user/lgg201 からダウンロードするか、対応するブログ投稿で参照できます。
SQL 解析方法は多数あります。不足している点があれば修正してください。
0. ダウンロード:
このプログラムは自由に改変して配布することができ、http://download からダウンロードできます。 .csdn.net/user/lgg201
1. ページングの必要性
現在のインターネットおよび企業情報システムの主な役割は、大量のデータから適切なデータを見つけることです。
準拠 通常、条件のデータは数万個あり、ユーザーが一度に受け取る情報の量は非常に少ないです。ユーザーの条件を満たす情報が一度にユーザーに表示されます。ほとんどのシナリオでは、ほとんどのデータは冗長になります。
情報の取得が完了した後、データは送信 (ストレージ メディアからアプリケーションへ) などを経る必要があります。したがって、この冗長性を減らすために、セグメント化された情報検索メカニズムが必要です。
ページングの開発
基本的なページング プログラムは、データを次のように分割します。 ceil (total_record / page_size) ページごとのレコード数 (page_size) に応じて、最初のデータの段落がユーザーに表示されます。その後の対話プロセス中に、ユーザーは特定のページに移動することを選択できます。
その後、主に Weibo アプリケーションの出現後、情報の急速な変化により、その特徴は、このように、基本的なページング プログラムでは対応できなくなりました。ニーズ: a) 次のページを取得するときに、データ セットが大幅に変更されている可能性があり、ページをめくるたびにデータの重複やジャンプが発生する可能性があります。 b) このようなアプリケーションでは、複数のデータを 1 つの画面上に表示する多くのユーザー インターフェイスが使用されます。これにより、データの重複/ジャンプがユーザー エクスペリエンスに与える影響がさらに悪化します。そのため、プログラマーは、同じユーザー インターフェイスで、次のデータ取得ポイントを記録するために、
を使用するようになりました。ユーザーの読書行動を通じてデータの次/前の段落を自動的に取得することは、「次のページ」ボタンをクリックするユーザー エクスペリエンスよりも確かに優れていますが、欠点もあります。 a) ユーザーが 100 ページに到達したとき、興味のあるページ 5 の情報に戻るのは簡単ではありません。実際、これは 1 つのページにあまりにも多くの画面を含むユーザー インターフェイスを許可することはできません。ユーザー エクスペリエンスが低下します。 ; b) データの観点から見ると、一度に 1 つの画面しか表示されていない場合、複数の読み取り間の間隔はデータに何らかの変化を引き起こすのに十分であるため、これらの問題を見つけるのは困難です。ユーザーエクスペリエンスに影響を与えます)) ただし、1 ページに 100 画面のデータが表示されると、この変化はさらに大きくなります。 c) プログラムの観点から見ると、同じユーザー インターフェイス上に大量のデータが存在すると、ユーザー インターフェイスのプログラム ロジックが影響を受けることは避けられません。上記の考慮事項に基づいて、現在のアプリケーションでは、ページングの見直し、1 ページに表示される画面の数の制限、および追加が開始されています。さらに、データ ロジックの正確性を確保しながら (エラーを減らして) 最適なユーザー エクスペリエンスを実現するために、since_id のメソッドも組み合わせています。
3. ページネーションの議論
4 人の同僚 xp/jp/zq/lw が議論に協力してくれました。多くの議論に基づいて、ページング プログラムの性質を分析しました。主な結論は次のとおりです:
1) ページングの目的はセグメント内のデータを読み取ることです。 🎜> 2) データベースのストレージ順序に依存する場合でも、ページングできるデータは順序どおりである必要があります (これは別の方法で理解しやすくなります。データ セットが変更されない場合、同じ入力が複数回実行されます。 、出力順序は変更されません)
3) すべてのセグメント化されたデータの読み取り データセットの一貫性を完全に保証するには、データセットシーケンスの一貫性、つまりスナップショットを保証する必要があります
4) 従来のページングとセグメント化ページング (各ページは複数のセグメントに分割されます) は、MySQL の SQL 構文にマッピングされたデータ セットに対して最終的に 1 回実行され、入力に基づいて制限句を取得することが適用されるシナリオです。データセットが低い
5) Because_id タイプのページング、その本質は既存のデータが変更されていないと想定することであり、データセットは特定のポイント (データを絶対的に見つけることができる関連フィールド) の ID になります。データセット) がユーザー側に提供され、対応する位置のデータが読み取られるたびに、データセット内の履歴データの変更頻度が低いという使用シナリオがシミュレートされます。データは頻繁に追加されます
6) 各セッションの開始時にデータセットのスナップショット データを生成できるスナップショット システムがあれば、すべての問題は解決されます
7) スナップショット システムがない場合、 nce_id メソッドを使用してデータ範囲を制限し、スナップショット システムをシミュレートすると、ほとんどの問題を解決できます。
8) スナップショットをシミュレートするためにsince_id メソッドを使用するには、データ セットの並べ替えルールに、それぞれを一意に識別できるフィールドが必要です。そのデータ (おそらく複合)
4. 実装のアイデア
1) SQL 変換機能を提供します
2) セグメント化されたページング (page、page_ping、ping、ping_size)、従来のページング (page、page_size) をサポートします。オリジナルページング (offset-count)、since_id ページング (prev_id, next_id)
3) 分割ページング、従来型ページング、オリジナルページングを最下位層でオリジナルページング処理に変換
5. 実装定義
ping_to_offset
入力:
page #要求ページ番号、範囲: [1, total_page]、範囲を超えた場合は境界線で計算され、つまり0は1に修正され、total_page + 1は次のように修正されますtotal_page
ping #リクエストセグメント番号、範囲: [1, page_ping]、範囲を超える場合は境界として計算され、つまり0は1に修正され、page_ping + 1はpage_ping
に修正されます page_ping #番号ページあたりのセグメント数、範囲: [1, 無限]
count #取得するレコードの数、現在のアプリケーション シナリオの意味は次のとおりです: セグメントあたりのレコードの数、範囲: [1, 無限]
total_record #レコードの総数、範囲: [1, 無限]
出力:
offset #Offset
count #項目数の読み取り
offset_to_ping
入力:
offset #Offset ( count に従って整列する必要があります。つまり、count で割ることができます)、範囲: [0, 無限]
page_ping #1 ページあたりのセグメント数、範囲: [1, 無限]
count #Number of読み取り、範囲: [1, 無限]
出力:
page #リクエスト ページ番号
ping #リクエスト セグメント番号
page_ping #ページごとのセグメント数
count #送信するレコードの数現在のアプリケーション シナリオの意味は次のとおりです: セグメントあたりのレコード数
page_to_offset
入力:
page #リクエスト ページ番号、範囲: [1 , total_page]、範囲を超える場合は、境界、つまり0を1に修正、total_page + 1をtotal_page
total_record #総レコード数、範囲: [1, 無限]
count #現時点で取得するレコード数 意味アプリケーション シナリオの次のとおりです: ページあたりのアイテム数、範囲: [1, 無限]
出力:
offset #offset
count #number of items read
offset_to_page
input:
offset #Offset (count に従って整列する必要があります。つまり、count で割り切れる必要があります)、範囲: [0, 無限]
count #読み取る項目の数、範囲: [1, 無限]
出力:
page #リクエストページ番号
count #取得するレコードの数、現在のアプリケーションシナリオの意味は次のとおりです: ページあたりのレコード数
sql_parser #mysql文法に準拠したSQL文を解析します各コンポーネントを取得するための仕様
入力:
sql #解析対象の SQL ステートメント
出力:
sql_components #SQL 解析フィールド
sql_restore #SQL ステートメントコンポーネントセットを SQL ステートメントに変換
入力:
sql_components #復元対象の SQL ステートメント コンポーネント セット
出力:
sql #復元された SQL ステートメント
sql_to_count #mysql 文法仕様に準拠した SELECT ステートメントを変換してカウントを取得
入力:
sql_components #クエリに変換されるカウント対象 SQL 文コンポーネントセット
エイリアス #カウントフィールドのエイリアス
出力:
sql_components #変換されたクエリカウント SQL 文コンポーネントセット
sql_add_offset
入力:
sql_components #オフセット SQL ステートメント コンポーネント セットを追加するには、LIMIT コンポーネントは許可されません
offset #Offset (カウントに従って整列する必要があります。つまり、カウントで除算できます)、範囲: [0,無限]
count #取得するレコード数 数値、範囲: [1, 無限]
出力:
sql_components #LIMIT コンポーネントを追加した SQL 文コンポーネントセット
sql_add_since #since_id 式の範囲を増やす
入力:

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











HQL と SQL は Hibernate フレームワークで比較されます。HQL (1. オブジェクト指向構文、2. データベースに依存しないクエリ、3. タイプ セーフティ)、SQL はデータベースを直接操作します (1. データベースに依存しない標準、2. 複雑な実行可能ファイル)。クエリとデータ操作)。

「OracleSQLでの除算演算の使用方法」 OracleSQLでは、除算演算は一般的な数学演算の1つです。データのクエリと処理中に、除算演算はフィールド間の比率を計算したり、特定の値間の論理関係を導出したりするのに役立ちます。この記事では、OracleSQL での除算演算の使用法を紹介し、具体的なコード例を示します。 1. OracleSQL における除算演算の 2 つの方法 OracleSQL では、除算演算を 2 つの異なる方法で実行できます。

Oracle と DB2 は一般的に使用される 2 つのリレーショナル データベース管理システムであり、それぞれに独自の SQL 構文と特性があります。この記事では、Oracle と DB2 の SQL 構文を比較し、相違点を示し、具体的なコード例を示します。データベース接続 Oracle では、次のステートメントを使用してデータベースに接続します: CONNECTusername/password@database DB2 では、データベースに接続するステートメントは次のとおりです: CONNECTTOdataba

MyBatis 動的 SQL タグの解釈: Set タグの使用法の詳細な説明 MyBatis は、豊富な動的 SQL タグを提供し、データベース操作ステートメントを柔軟に構築できる優れた永続層フレームワークです。このうち、Set タグは、UPDATE ステートメントで SET 句を生成するために使用され、更新操作でよく使用されます。この記事では、MyBatis での Set タグの使用法を詳細に説明し、特定のコード例を通じてその機能を示します。 SetタグとはMyBatiで使用するSetタグです。

SQL における Identity とは何ですか? 具体的なコード例が必要です。SQL では、Identity は自動インクリメント数値の生成に使用される特別なデータ型です。多くの場合、テーブル内のデータの各行を一意に識別するために使用されます。 Identity 列は、各レコードが一意の識別子を持つようにするために、主キー列と組み合わせてよく使用されます。この記事では、Identity の使用方法といくつかの実用的なコード例について詳しく説明します。 Identity の基本的な使用方法は、テーブルを作成するときに Identity を使用することです。

ネットワークに ping が送信できません。何が起こっていますか?実際、これは非常に一般的な問題であり、主に 2 つの状況に分けられます: 同じネットワーク セグメント上で ping が失敗する場合と、異なるネットワーク セグメント上で ping が失敗する場合です。以下で詳細を見てみましょう。 ping コマンドが同じネットワーク セグメントに接続できない理由は通常 2 つあります。1 つは、同じネットワーク セグメント内で ping できない IP アドレスであり、もう 1 つは、別のネットワーク セグメントで ping できない IP アドレスです。これら 2 つの状況には、異なる解決策があります。まず、同じネットワーク セグメント内で ping が失敗する状況について説明します。 1. 同じネットワーク セグメント上で ping が失敗し、結果は「ターゲット ホストにアクセスできません。」宛先 IP と送信元 IP が同じネットワーク セグメント上にあり、ping 結果は &l になります。

ping リクエストのタイムアウトの理由には、ターゲット ホストに到達できない、ネットワークの混雑、ファイアウォールまたはセキュリティの設定、DNS 解決の問題などが含まれます。詳細な紹介: 1. ターゲット ホストに到達できません。Ping リクエストのタイムアウトは、ネットワーク経由でターゲット ホストにアクセスできないことを意味する可能性があります。これは、ターゲット ホストがネットワーク接続を閉じていること、ターゲット ホストが存在するネットワークに障害が発生していることが原因である可能性があります。 、ターゲット ホストの IP アドレスが正しく設定されていないなど; 2. ネットワークの混雑 Ping リクエストのタイムアウトは、ネットワークの混雑によっても発生する可能性があります。ネットワークの混雑は、大量のデータ送信やネットワーク機器の障害などが原因である可能性があります。

解決策: 1. ログインしているユーザーがデータベースにアクセスまたは操作するための十分な権限を持っているかどうかを確認し、ユーザーが正しい権限を持っているかどうかを確認します; 2. SQL Server サービスのアカウントに指定されたファイルまたはデータベースにアクセスする権限があるかどうかを確認します。 3. 指定されたデータベース ファイルが他のプロセスによって開かれているかロックされているかどうかを確認し、ファイルを閉じるか解放して、クエリを再実行します。管理者として試してください。Management Studio をなどとして実行します。
