この記事の例は、smarty での単純なページングの実装方法を説明しており、参考のために皆さんに共有されます。具体的な実装方法は以下の通りです
以下はテンプレート内の Smarty コードです。smarty を使用して関連する変数を置き換えます。これは非常に簡単ですが、PHP コードで page パラメーターを渡す必要があります。とてもシンプルなのでこのように分けると良いと思います。ますますsmartyを使うのが好きになりました。
PHP コードは次のとおりです:
賢いページネーションの問題
最初の方法:
このアイデアは、最初の 90 項目を抽出し、次に最初の 100 項目を抽出するなど、ページ番号に基づいてデータの 2 つの部分を抽出し、2 つの結果の差を比較することです。
30万レコードの場合、たったの100ページに分割すれば(結果は1万レコード)、約1分半かかります。インデックスがうまく構築されていれば、約 1 分かかります。
//select * from //この文は結果から読み取られるため変更できません。そのため、 *
//(select top @h_count (@filedlist) from @tableName.... .) を使用する必要があります。 big //条件の上限を満たすレコードを取得します
//where
//big.guid //ここがキーで、主キーに基づいて下限の結果から重複レコードを除外します(異なるデータのみを残します) 、つまり、交差の検索です)
//入っていません
//(@table から先頭の @l_count guid を選択します....)//下限
//order @orderby //元の形式、orderby 以降のもののみがここで保持される場合は、gruopby などを含む条件の後のすべてを保持する必要があります。
関数は次のようになります。
public string MakeSqlPager(string sourceSql,int pageIndex)
{
//デフォルトのページ サイズを使用します
string orderbyStr =sourceSql.Substring(sourceSql.ToLower(). IndexOf("order by"));
int Index=sourceSql.ToLower().IndexOf("select");
string bigRes="("+ sourceSql.Insert(index) +6," top "+((pageIndex+ 1)*_pageSize).ToString()+" ")+") as big";
string smallRes="("+sourceSql.Insert(index+6,"top "+ (pageIndex*_pageSize).ToString()+ " ")+")";
return "select * from "+bigRes+" where big.guid not in "+smallRes+" "+orderbyStr;
}
このメソッドは次のようになります改善されました。つまり、2 回目のフィルタリングを行うとき、最初の結果からフィルタリングします。
2番目の方法:
先頭と末尾をピンチオフします。プログラムはまだ書かれていません
SELECT * FROM
(
SELECT TOP 100 * FROM
(
SELECT TOP 100000 * FROM pagetest ORDER BY regt ASC
) as a
ORDER BY regt desc
) as b
ORDER BY regt ASC
がテストされ、約 29 秒かかりました。
比較:
最初の方法の効率は非常に低く、複数のループ比較が必要であり、時間計算量が 1 レベル高いためと推測されます。たとえば、このメソッドの応答時間は、取得されるページ番号と大きな関係があります。
2 番目の方法もまだ受け入れられます...残りの全文>>