私は通常、MySQLでストアドプロシージャを使用しているとは思っていません。十分に成熟していないと思いますが、これは古典的なケースです。
私は依然としてコメントの順序を取得するためのクエリと関連する行を取得するクエリの2つを必要としますが、LIMITの値は1つのクエリ内で完了したクエリを実行する前にわかっています。
膨大な結果セットについて話していない場合は、すべての結果とコメントの順序を単純に取得し、関連するページコメントのみを表示するためにarray_sliceを使用する方が効率的かもしれません。
/* get the comment order */
SET @commentOrder = 0;
SELECT commentOrder INTO @relevantCommentOrder FROM (
SELECT commentID, @commentOrder := @commentOrder+ 1 as commentOrder
FROM COMMENTS
ORDER BY creationDate) commentsOrder
WHERE commentID= 45;
/* get the value we want to use in the LIMIT clause */
SET @startFrom = CONVERT(ROUND(ROUND(@relevantCommentOrder/10)*10) ,UNSIGNED);
/* fetch relevant results */
PREPARE STMT FROM 'SELECT * FROM COMMENTS LIMIT ?,10';
EXECUTE STMT USING @startFrom;
次のものがすべての行全体の結果が設定され、あなたを取得し、にコメントの順序を置く1つのクエリですので、あなたは、単にPHPの内部で最初の行のrelevantCommentOrderフィールドをチェックすることができ、その後、その配列をスライス関連するコメントだけが表示されますが、結果セット全体が大きすぎないと効率的です。
SET @commentOrder = 0;
SELECT *, @relevantCommentOrder;
FROM (
SELECT commentID, @commentOrder := @commentOrder+ 1 as commentOrder,
@relevantCommentOrder := case when commentID = 45
then @commentOrder
else @relevantCommentOrder end
FROM COMMENTS
ORDER BY creationDate) subQuery;
コメントは時刻(新しいもの)順に並べ替えられているため、ID 45のコメントは午前1ページ、午後4ページに表示されます。 – rayed
はい、しかし、合計数のコメントが分かっている場合は、後ろ向きに作業する必要があります。たとえば、合計120件のコメントと1ページあたり25件のコメントがある場合、120〜96ページが1ページに表示され、 95〜71ページ目は2ページ目、70〜46ページ目は3ページ目となり、45ページ目は4ページ目の最初のコメントとなります。これを判断するために必要な唯一の情報は、合計コメント数、コメント数、ページ、およびターゲットコメントの数。あなたのページには1から始まる番号が付けられていると仮定して、 'ceil((total-target + 1)/ perpage)という式で見つけることができます。 – Amber
説明のためDavに感謝します。コメント数、ページあたりのコメント数などが含まれていますが、ターゲットコメントの番号はありません。IDのみを持っています。 IDが見つかるまで結果をトラバースすることができますが、実用的ではありません。 – rayed