2009-09-04 13 views
1

クエリ結果内の特定のアイテムの順序を知る方法はありますか?MySQLクエリ結果内のアイテムの順序

私はAjaxifiedの方法で、ユーザーのコメントを表示するWebアプリケーションを持って、私はこのような彼らのコメントをユーザーにリンクを送信したいと思います:

http://my.web/post/12345#comment_45

とハッシュ値を使用して「comment_45」ロード与えられたコメントのコメントページですが、結果全体をトラバースして正しいページを取得する方法はわかりません。

答えて

0

は賢明な方法で注文したあなたのコメントでいただきありがとうございますか!それらが常に最初から最後(または最後から最初)まで数値順に表示されている場合は、a)総コメント数、b)ページあたりのコメント数を知ることに基づいて、どのページを計算することができるはずです。

+0

コメントは時刻(新しいもの)順に並べ替えられているため、ID 45のコメントは午前1ページ、午後4ページに表示されます。 – rayed

+0

はい、しかし、合計数のコメントが分かっている場合は、後ろ向きに作業する必要があります。たとえば、合計120件のコメントと1ページあたり25件のコメントがある場合、120〜96ページが1ページに表示され、 95〜71ページ目は2ページ目、70〜46ページ目は3ページ目となり、45ページ目は4ページ目の最初のコメントとなります。これを判断するために必要な唯一の情報は、合計コメント数、コメント数、ページ、およびターゲットコメントの数。あなたのページには1から始まる番号が付けられていると仮定して、 'ceil((total-target + 1)/ perpage)という式で見つけることができます。 – Amber

+0

説明のためDavに感謝します。コメント数、ページあたりのコメント数などが含まれていますが、ターゲットコメントの番号はありません。IDのみを持っています。 IDが見つかるまで結果をトラバースすることができますが、実用的ではありません。 – rayed

0

SQLデータベース内の行の順序は、定義されていません。後続のクエリで同じ順序を保証するには、 "order by"句を含める必要があります。その後、あなたは次のクエリで、あなたがやりたいことができ

SELECT * FROM `your_table` ORDER BY `date_entered` LIMIT 45, 1 

行が挿入またはクエリの間で削除された場合、その結果は、ユーザーが期待するものを正確になりませんが、これは通常、ご注文いただいた場合の問題ではありません-byフィールドは日時です。

1

このURLの生成方法や場所はわかりませんが、URLが作成されたときのコメントがわかっている場合は、後でその日時を知っておく必要があります。それは、各コメントが一意のIDを持っているように思えます(そうでなければ、そうするべきです)。

コメントはありません。特定のページの特定のコメントは、あとでコメントを取り戻す信頼できる方法です(ページの前の別のコメントや別のページが削除された場合はどうなりますか? ?

select field1, field2, ... fieldn from comments where comment_id = id; 
:コメントはIDを持っており、あなたのURLで「comment_45」は、実際にこのIDである場合にはページ上のコメントの表示など)

は、あなただけのこのコメントを取得するには、次の一般的なSQLクエリを使用することができます

この場合、idは、URLによって提供されるコメントID(「45」部分コメント_45の)この情報は信頼できないソース(インターネット)からのものであるため、SQLインジェクションを防ぐために入力をサニタイズする必要があります。

+0

URLはユーザー自身のページにあります。プロフィールページのようにコメントのすべてにリンクしていますが、コメントIDを取得できますが、コメントの順序はわかりません。注文を知ることで、正しいページを見ることができます。 – rayed

+0

他のコメントも同様に表示したい場合は、リンクによって提供されたコメントにページが集中していて、複数のコメントページがある可能性があります – shufler

0

私は通常、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; 
関連する問題