0

私は次のdb構造を持つphpとmysqlでブログシステムを開発しています:

Article
   -id
   -firstMessage
   -lastMessage
   -body

Comment
   - id
   - article_id
   - publiched_date
   - body

ここでのアイデアは、ページごと[first][1][2][3][last]10の コメントのようなリンクツリーを表示する、コメントの多い記事を利用することです。すべてがうまくいきます。URLごとのページ番号に従って10個のメッセージを選択する素敵なSQLを作成しました。

example.com/?article=3&page=2

問題はどこにありますか?さて、私が私のホームページにこのURLを持っていると仮定します:

example.com/?article=3&message=3565

上記のURLによると、このメッセージが表示されているページ番号を特定するにはどうすればよいですか?私を正しい方向に導くためのアイデアはありますか?

編集

  • メッセージIDは連続していません。たとえば、記事にコメントを含めることができます:125、364、561、1522
4

5 に答える 5

3

ページごとに10個のコメントを表示し、メッセージ3565を要求する場合は、次のように実行できます。

$pageNumber = floor($_GET['message'] / 10) + 1;

編集

@Alixに感謝します。

編集#2

OPに編集を加えた後、データベース構造がどのように見えるかを確認せずに、最悪のシナリオでは、サイトに表示されるコメントのリスト全体をフェッチして、メッセージのインデックスを見つける必要があります。探している。

それは必ずしもあなたが聞きたかったことではないことを私は理解していますが、あなたのデータベースがどのように見えるかを見ずに知る他の本当の方法はありません。

于 2012-10-09T18:19:28.563 に答える
2

私はあなたがクエリをしなければならないと思います、そのようなものはうまくいくはずです:

SELECT CEIL((COUNT(id) + 1) / $nb_message_per_page) AS page_for_message
FROM comment
WHERE article_id = $article_id
AND published_date < (SELECT published_date FROM comment WHERE id = $message_id)

コメントを表示するために選択した並べ替えに応じて、のを変更する必要が<あり、そのクエリは並べ替え>を想定していますpublished_date DESC

PS:タイプミスかどうかはわかりませんが、publiched_dateDBスキーマを書き込んでいます

編集
ソートが行われない場合、行はおそらくソートのような主キーでソートされpublished_date DESCます

編集2
@bfrohsが言うように、テスト(<)がオンpublished_date(または一意でないデータを含む他の列)の場合、このクエリは不正確な結果を示します(1つのケースでは発生します) id
注文がないので、使用idする方が良い解決策です。

于 2012-10-09T18:34:51.183 に答える
2

基本的に、同じ記事からコメントを選択し、ID(または、順序が狂ってidいる可能性がある場合は別の列-連続していない場合は問題ありません)で並べ替え、結果を少し計算します。コード(デモ)は次のとおりです。

SELECT (
  SELECT CEILING((count(*) + 1) / 10)
  FROM `Comment`
  WHERE `id` < `comment`.`id`
  AND `article_id` = `comment`.`article_id`
) AS `page`
FROM `Comment`
WHERE `id` = ?
AND `article_id` = ?

コメントIDと記事IDをある場所にプラグインするだけ?です(または、さらに良いことに、この正確なコードをプリペアドステートメントで使用します)。101ページあたりのコメント数を変更する場合は、クエリでも必ず変更してください。

このクエリでは、上のインデックスarticle_id(および上のPRIMARYインデックスid)が必要です。

于 2012-10-09T19:06:20.203 に答える
1

ページごとに表示するアイテムの数を設定し、それを使用してメッセージをページに分割する必要があります

于 2012-10-09T18:18:59.030 に答える
1

メッセージ番号からページに戻るのは簡単ではありません。最も簡単な方法は、ページ番号をメッセージ読み取りスクリプトに渡すだけです。そのため、そのページ番号を「戻る」リンクに埋め込むことができます。たとえば、...

messages.php:

<a href="readmessage.php?messageID=1234&page=7">1234</a>

readmessage.php:

<a href="messages.php?page={$_GET['page']}">Back</a>

これにより、ページ番号を携帯するだけなので、どのページから来たのかを計算する手間が省けます。

于 2012-10-09T18:29:15.230 に答える