• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:検索結果をgoogleのように数件ずつ表示)

Googleのような検索結果ページで3件ずつ表示する方法

このQ&Aのポイント
  • データベース初心者で申し訳ないのですが、検索結果を3件ずつ表示する方法を教えてください。
  • 検索結果を自動で1ページ、2ページと振り分けてくれるものを作りたいです。
  • 検索ページがPHP+MySQLで作られているので、同じものでできればと思っています。

質問者が選んだベストアンサー

  • ベストアンサー
  • NARH
  • ベストアンサー率82% (88/107)
回答No.2

> 各ページを作って次のページへのリンクを手作業で貼っていくみたいなのがあって、まさか全ページ分作るわけにもいかないので、PHPなら全件数を取得して1ページだけ作れば http://~?page=3 と、各ページが作れるのかなと思っておりまして さすがにそんなことはしませんね。 # データの件数って変わるもんですし。 パラメータから offset 値を作れればいいので、直接offset値を渡してもいいですし、 ページ番号から生成してもいいと思います。 考え方は同じですのでやってみてください。

rabbit-kimura
質問者

お礼

offset値がまだ使いこなせていませんが、丁寧なご回答をいただき、かなり理解が深まったと思います!!(自分の中でですが) ありがとうございました!!

その他の回答 (1)

  • NARH
  • ベストアンサー率82% (88/107)
回答No.1

> ※あらかじめLIMITで1~3件、4~6件を表示させるというページを作っているやり方でなく、 > 検索結果を自動で1ページ、2ページと振り分けてくれるものと考えています。 ここが、どういう意味なのかちょっと解らないのですが、普通に LIMIT(, とOFFSET)で作ってますね。 例えば 10 件のデータをページングする場合 1頁目: 1 ~ 3件目表示 2頁目: 4 ~ 6件目表示 3頁目: 7 ~ 9件目表示 4頁目: 10件目表示 と全部で4頁になりますよね。で、それぞれの頁で発行するSQLは 1頁目: SELECT * FROM TABLE1 WHERE anime LIKE '%検索語%' ORDER BY age LIMIT 0, 3; 2頁目: SELECT * FROM TABLE1 WHERE anime LIKE '%検索語%' ORDER BY age LIMIT 3, 3; 3頁目: SELECT * FROM TABLE1 WHERE anime LIKE '%検索語%' ORDER BY age LIMIT 6, 3; 4頁目: SELECT * FROM TABLE1 WHERE anime LIKE '%検索語%' ORDER BY age LIMIT 9, 3; となりますよね、変わっているのは頁数と、LIMITの最初の数値(offset)ですね。 つまり頁のリンクに対して、offset値をパラメータで渡せば動的につくることができます。 (ページング時に同じ検索をしなければならないので、なんらかの方法で検索語を保持する必要もあります) 頁数は (データ件数 / 表示数) で割り切れなければ + 1です。 この場合は ( 10 / 3 ) + 1 = 4頁(検索条件がない場合) mysql_num_rows は検索結果のレコード数を返しますが、上記SQLの場合は常に 3以下になってしまうので、別途SQLを投げる必要がありますね。 (MySQLではそうしない方法もあるのですが、まずは基本でしょうね) これは普通に SELECT COUNT(*) ~ でもいいでしょう SQLを2発投げることに抵抗があるかもしれませんが、1発で全件取得しても、1頁に10件表示としたら、1000件のデータがあったら 990件無駄になってしまいます。こちらの方が一定したコストなのでまだコントロールしやすいですね。 このロジックでプログラムをしていけば作れると思います。 ソースをカスタマイズしてみたのですが、文字数の都合で貼りつけできなかったので、考え方だけ回答します。 他にも方法はありますが、 - 1頁に表示する件数 - 全体の件数 - 頁数 - offset値 これらの要素で一緒かなと思います。

rabbit-kimura
質問者

お礼

ありがとうございました!!

rabbit-kimura
質問者

補足

>> 検索結果を自動で1ページ、2ページと振り分けてくれるものと考えています。 >ここが、どういう意味なのかちょっと解らないのですが、普通に LIMIT(, と >OFFSET)で作ってますね。 すみません、 1ページ LIMIT 0, 3; 2ページ LIMIT 3, 3; 3ページ・・・・ と、各ページを作って次のページへのリンクを手作業で貼っていくみたいなのがあって、まさか全ページ分作るわけにもいかないので、PHPなら全件数を取得して1ページだけ作れば http://~?page=3 と、各ページが作れるのかなと思っておりまして (すみません、ちょっと言葉にしづらいようですっ) 伝わりにくくて申し訳ございませんっ!! ご回答を元に頑張ってみます!!

関連するQ&A