2007年11月05日

どうしたら全件取得しないでページングできるのか?

前回、LIMIT句を単純に用いてまんまと失敗した件を書いたわけですが、まああれは実際試したというよりはBlog用という側面も多々あり(^^;ってかちょっと考えればわかりますよね。ということで今回は問題点を考えてみます。

まず何が悪いかってHABTMです。いやHABTMは本当は悪くなくて、いけないのはそれをあのように表示しようとするからおかしなことになっているわけです。

実際に前回のSQLを発行した結果を多次元配列などに格納せずそのままベタで表示すると以下のような感じになっています。

|北海道|函館市|函館市|2004-12-01|
|北海道|函館市|戸井町|2004-12-01|
|北海道|函館市|恵山町|2004-12-01|
|北海道|函館市|南茅部町|2004-12-01|
|北海道|函館市|椴法華村|2004-12-01|
|北海道| 森町 |砂原町|2005-04-01|
|北海道| 森町 | 森町 |2005-04-01|
        :
        :

まあ見ての通りなんですが、自分のような素人はこの結果を見ると単純に「なんてRDBって融通が利かないんだ?!」とか思ってしまうのですが…。数学的な高尚な理論に基づいた方式でやるとどうもこうなってしまうらしいですね(笑)。

で、まあこの状態にLIMITをかけるわけですから前回のような結果になったのもDBの中の人?からすれば至極当然なんでしょうが、素人代表としてはどうにも納得がいかないというか、少なくともダブってるところぐらいなんとかしろよ!とか言いたくなってしまうのです。

|北海道|函館市|函館市|2004-12-01|
|    |    |戸井町|      |
|    |    |恵山町|      |
|    |    |南茅部町|      |
|    |    |椴法華村|      |
|北海道| 森町 |砂原町|2005-04-01|
|    |    | 森町 |      |
        :
        :
(こんな感じに…ってか、かなりズレてるし

上記の表示だと横罫線がないのでこれでいいような風にも見えますが、実際のHTMLのTableタグでは、さらに上下のコラムを連結して、つまり<td rowspan="5">ぐらいまでやってくれないと納得がいきません。

って表示系のことばかり文句たれてますが、まあ素人にとっては最終的な結果の画面が何よりも重要でして、このような表示にするのにおそらく最も最適なデータ形式?が前述の通りの多次元配列だったりするわけです。

ですがあくまで多次元配列に格納する前の状態は↑の最初の方のようになってるわけで、話をLIMITに戻せば当然のように前回の結果となってしまいます。

これは正直いって結構悩みました。スクリプト自体は滅茶苦茶遅い(時がある)とはいえ、LIMITを使わないページングで一応動いているわけですし、手直ししようにもその時点ではどうしたらよいのかすらわからない状態でした。

表示を↑の2番目のようにするにはどうしたらよいのか?とか、HABTMではない単純な?テーブルのページング(LIMITを使う方式も、そうでない方式も)の方法などはネットで調べると結構でてきますが、このような例の場合の手法?というか標準的なやり方みたいなものはなかなか探しても見つかりませんでした。

そもそも質問したいのはヤマヤマでもこれまでココの日記で述べてきたようなことを簡潔に質問するだけの器量もなく(--;途方に暮れる…というとちょっと大袈裟ですが、半ばあきらめてた時もありました。

そんな時以前からネット上で知り合いだったある本職のプログラマの方に質問する機会を得て、ちょっと聞いてみたところ、やはりプロの現場ではこうした状況も日常茶飯事的なものなのか?以外と簡単に答えを教えて頂きました。

最終的にその方法は使わなかったのですが、次回にその辺をまとめてみたいとおもいます。
ラベル:PHP
posted by ciallost at 03:28| Comment(0) | TrackBack(0) | 日記 | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。

この記事へのトラックバック