- ベストアンサー
Googleのような検索結果ページで3件ずつ表示する方法
- データベース初心者で申し訳ないのですが、検索結果を3件ずつ表示する方法を教えてください。
- 検索結果を自動で1ページ、2ページと振り分けてくれるものを作りたいです。
- 検索ページがPHP+MySQLで作られているので、同じものでできればと思っています。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
> 各ページを作って次のページへのリンクを手作業で貼っていくみたいなのがあって、まさか全ページ分作るわけにもいかないので、PHPなら全件数を取得して1ページだけ作れば http://~?page=3 と、各ページが作れるのかなと思っておりまして さすがにそんなことはしませんね。 # データの件数って変わるもんですし。 パラメータから offset 値を作れればいいので、直接offset値を渡してもいいですし、 ページ番号から生成してもいいと思います。 考え方は同じですのでやってみてください。
その他の回答 (1)
- NARH
- ベストアンサー率82% (88/107)
> ※あらかじめ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値 これらの要素で一緒かなと思います。
お礼
ありがとうございました!!
補足
>> 検索結果を自動で1ページ、2ページと振り分けてくれるものと考えています。 >ここが、どういう意味なのかちょっと解らないのですが、普通に LIMIT(, と >OFFSET)で作ってますね。 すみません、 1ページ LIMIT 0, 3; 2ページ LIMIT 3, 3; 3ページ・・・・ と、各ページを作って次のページへのリンクを手作業で貼っていくみたいなのがあって、まさか全ページ分作るわけにもいかないので、PHPなら全件数を取得して1ページだけ作れば http://~?page=3 と、各ページが作れるのかなと思っておりまして (すみません、ちょっと言葉にしづらいようですっ) 伝わりにくくて申し訳ございませんっ!! ご回答を元に頑張ってみます!!
お礼
offset値がまだ使いこなせていませんが、丁寧なご回答をいただき、かなり理解が深まったと思います!!(自分の中でですが) ありがとうございました!!