0

現在、次のようなクエリがあります。

$queryMovies = "SELECT
    m.movieID,
    n.title,
    m.directorID, d.directorFirstName, d.directorLastName,
    m.runTime,
    m.yearReleased,
    m.synopsis,
    m.formatID, f.format,
FROM movies m
LEFT JOIN directors d ON d.directorID = m.directorID
LEFT JOIN format f ON f.formatID = m.formatID
ORDER BY title";

結果は次のように jQuery の $.ajax 呼び出しに送り返されます。

$arr = array();

while($row = mysqli_fetch_array($resultMovies, MYSQLI_ASSOC)) {
    $arr[] = $row;
}
header('Content-Type: application/json');
echo json_encode($arr);

$.ajax 呼び出しの成功関数は、次のようなデータを処理します。

...
'<div class="synopsisCell">' +
    'Synopsis<br />' +
    '<label class="lblSynopsis">' + element['synopsis'] + '</label>' +
'</div>' +
'<div class="formatCell">' +
    '<label class="lblFormat">' + element['format'] + '</label>' +
'</div>' +
'<div class="yearCell">' +
    '<label class="lblYear">' + element['yearReleased'] + '</label>' +
'</div>' +
...

(ご覧のとおり、これは完全な出力の不完全なスニペットです)

データが配置されるテーブルにページネーションを追加する必要がありますが、これを処理する最善の方法がわかりません。(これまでページネーションのプログラミングを行ったことはありません)

(ページ数を決定するために)レコード数を取得する別のクエリを追加し始めましたが、ページネーションなどのレコードの開始と数で LIMIT 句を実行する必要があることに気付きました。

この時点で、次の2つのことを疑問に思っています。

A) 何らかの方法でレコード数を既存のクエリ/リターン コードに追加できますか。これを jQuery 側で使用して、ページネーション ナビゲーション (ページ番号と次/前/最初/最後のページ リンク) を構築できます。

また:

B) JSON オブジェクトから何らかの方法でレコード数を取得し、テーブルに表示する結果のセット (たとえば、20 レコードのセット) のみを表示することにより、JS 側でページネーションを完全に処理できますか?

また、ユーザーがページネーション ナビゲーション リンクをクリックしたときに、毎回クエリを再実行する必要がありますか、または過度のサーバー/データベース クエリを回避するために、おそらく JS にその情報を「保存」する方法がありますか?

私は特定のコーディングを探しているのではなく、正しい方向に進むための疑似コードを探しているだけです。

誰の助けにも感謝します。

4

2 に答える 2

1

A) を使用して、1 つのクエリでカウントと限定された結果を返すことができますSQL_CALC_FOUND_ROWS。パフォーマンス上の理由から、2 つの別個のステートメントを使用する方がおそらく高速です。

B) これも可能です。すべての結果を取得し、ページに応じて結果を非表示/非表示にすることができ、新しいページが選択されたときにブラウザーをリロードすることさえできません。大きな結果セットが予想される場合、これは高価なアプローチになる可能性があります。

データベース側で結果を制限したい場合:

// query, get result count
$count = ... COUNT(*)

// for pagination
$results_per_page = 20;  // arbitrary number
$total_pages = ceil($count / $results_per_page);
if(isset($_GET['page_num']) && $_GET['page_num'] > 0) {
  $page_num = $_GET['page_num']; // for example 2
}
else {
  $page_num = 1;
}
$upper_limit = $results_per_page * $page_num;
$lower_limit = $upper_limit - $results_per_page;

// query limited results
... LIMIT ".$lower_limit.", ".$results_per_page."

お役に立てれば。

于 2013-03-10T23:29:59.647 に答える
0
// on php
// $page, default is 1
$page = isset($_GET['page']) : $_GET['page'] : 1;
// $rows in page, default is 20
$limit = isset($_GET['limit']) : $_GET['limit'] : 20;
$offset = ($page - 1) * $limit;
$queryMovies = "SELECT
    m.movieID,
    n.title,
    m.directorID, d.directorFirstName, d.directorLastName,
    m.runTime,
    m.yearReleased,
    m.synopsis,
    m.formatID, f.format,
FROM movies m
LEFT JOIN directors d ON d.directorID = m.directorID
LEFT JOIN format f ON f.formatID = m.formatID
ORDER BY title
LIMIT $offset, $limit";

// can't remember if this going to work but this should
// give you an idea
$arr['config'] = array('current_page' => $page, 'limit' => $limit, 'total_number_of_rows' => 10000);

// do the json encoding

// in javascript you should use the info of
// the current_page to tell the user in what page he is
// using total_number_of_rows and limit, calculate the pages and show them to the
// user so he knows how many pages there are
于 2013-03-10T22:49:29.730 に答える