0

私は本のテーブルと人のテーブルを備えたデータベースを持っており、それぞれに約10万のエントリがあります。3番目のテーブルは、2つを接続しているため、多対多の関係にあります。本と人物IDの列に加えて、接続テーブルには、本と人物、fxライター、共同ライター、発行者などとの関係タイプを示す列もあります。

関係者と特定の関係タイプを含むすべての本のエントリのリストを返すクエリを作成する必要があります。2つのテーブルを結合すると、SQLは、複数の人物が関係している本に対して複数の行を返すため、後でphpでこれを整理します。本に関係する人の数は本ごとに異なり、予測可能なパターンはありません。

ページネーションシステムを作る必要があります。

この状況でページネーションを行う最も賢い方法は何でしょうか?

4

4 に答える 4

1

あなたにはいくつかの選択肢があります、私はそれらが2つのグループに分類できると思います

  1. すべての行を送信し、純粋なjavascriptでページネーションを実行します(クライアント側)
  2. SQLクエリで指定する制限に加えて、オフセットも指定します。そのオフセットはphpセッション内に保存され、ユーザーがページネーションで次/前を選択するたびにインクリメント/デクリメントされます。

長所/短所:

  1. すべてがクライアント内で処理されるため、セッションごとに1つの単一のSQLクエリであり、追加のhttpリクエストはありません。結果を見ているときにサーバー側で状況が変わると、視覚化された結果が古くなる可能性があります。転送される行の量が多いため、最初の視覚化の読み込み時間が長くなります。

  2. 単一のビューに実際に必要な行のみが照会および処理されます。より多くの行は、要求があった場合にのみ取得されます。行は常に最新ですが、行数が変更されている間にオフセット値を操作すると、問題が発生する可能性があります(まれなケース)。次/前のアクションごとに1つのhttpリクエストがありますが、単一のビューの読み込み時間が速くなります。


結合による1冊の本の複数のヒットの問題の場合:

ここでは別の戦略に従う必要があると思います。

  1. サブクエリ(クエリ内のクエリ)を使用するか、人を考慮せずに本を取得する内部クエリのオフセットと制限を指定できます。次に、外部クエリは、個人を内部クエリの結果に結合します。

  2. 本に関連付けられている複数の人の個別の行を取得するのではなく、それらのヒットをグループ化し、名前などを連結して人を結合します。あなたが検索する各本の人のセットのように。そうすれば、オフセットと制限を指定するのに問題はありません。

于 2012-11-25T22:14:50.330 に答える
1

1ページ目にLIMIT0,20、2ページ目にLIMIT 20,20などを使用できるように、他の人と一緒に残さに本を選択する必要があります。

次に、各本の人のリストを個別に取得します。書籍ごとに1つのSQL呼び出しを使用することも、選択した書籍のすべてを取得してそのリストをいじることもできます。

于 2012-11-25T22:39:13.680 に答える
1

を使用して、書籍ごとにすべての関係者を1行で選択しgroup_concat、結果セットを次のようにページ分割できます。limit offset, num_rows

select b.book_id, b.title, ..., group_concat(c.type), group_concat(p.name)
from books b
join connections c on c.book_id = b.book_id
join persons p on p.person_id = c.person_id
group by book_id
limit 100, 50
于 2012-11-25T22:41:40.567 に答える
0

以前の回答が示唆しているように、おそらくSQL内で作業する必要があるため、これはひどい形式です。しかし、あなたはそれをすべてPHPで疑っているとコメントしました。とはいえ、すべての結果がスクリプトに含まれている場合(つまり、巨大なデータベースの結果ではない場合)、PHPで非常に簡単に処理することができます。

  1. 結果を$_SESSION変数に格納します。
  2. 結果の長さを数えます。
  3. 結果を1ページあたりのアイテム数で割ります。
  4. forは、最初のページのアイテムを表示する結果をループします。
  5. クエリ文字列またはその他の手段とともにページ番号を渡すリンクを作成します。
  6. 次のページの次の項目から始まる結果をループするためなど。

count()のPHP.netマニュアルページで提供されているカスタム関数のいくつかに興味があるかもしれません。

于 2012-11-25T23:12:23.257 に答える