[三流君] −−>
[ASPで遊ぶ、失敗する] −−>
[バックナンバー一覧]
−−> No.083 Select TOP 20 と Select Top n PERCENT で遊ぶ
Select TOP 20 と Select Top n PERCENT で遊ぶ
本文(発行内容)
<Select TOP 20 と Select Top n PERCENT で遊ぶ>
こんにちは、三流プログラマーのKen3です。
前回、
データが100件あって、20行単位で画面にデータを表示したい、
そんなよく見かけるページ処理に挑戦してみました。
今回は、その続きをグダグタと・・・
/*
* 1.今回のキッカケ
*/
掲示板で下記の質問をもらいました
------
質問2:検索キーワードから表示したデータの改ページ処理機能
(検索結果が30件あったら、とりあえず20件まで
表示させ”次ページ”ボタン等で残り結果を表示させる
ように・・・)
------
と、
ページ単位の表示について、質問をもらいました。
に対して、
ページ番号を受け取り、
Set rs = db.Execute("Select * From log ORDER BY WriteTime DESC")
'データの頭だし 芸無く空読みする
nCNT = 1
'EOFまでループ or データが(nPAGE-1)*20まで空読み
Do While rs.EOF = False And nCNT <= (nPAGE-1) * 20 '.EOFがFalseで件数以下
'次のレコードにポインタを移動する(何もしてないのに・・・(笑))
rs.MoveNext 'これを忘れると悲惨なことに、、、
'カウンタを増やす
nCNT = nCNT + 1
Loop
なんて、やってました。
http://www.ken3.org/cgi-bin/test/test082-1.asp?page=7
と、指定ページに飛べることは、飛べるけど・・・
SQL Select文をいろいろと探っていたら、
今回の件とはあまり関係無いけど、
^^^^^^^^^^^^^^^^^^^^^^^^^^
Select TOP 20 とか Select 20 〜 なんて項目を見つける
/*
* 2.Select TOP XXX を使ってみた
*/
SQLの基本とか言われそうだけど、
Select文で、条件を絞るのには、Whereの条件式を使います、
帰ってくる結果を調整する書き方、
Select TOP 30 なんて書き方ができるんですね。
ランキングの表示で、
Select URL, Count(URL) As URLCNT From log
GROUP BY URL
HAVING Count(URL) >= 50
ORDER BY Count(URL) DESC
と、
SQL文 HAVING句でGroup化されたレコードに条件設定する
http://www.ken3.org/cgi-bin/test/test043-1.asp
で、
件数が50件以上の上位データを表示してましたが、
TOPってキーワードを使うと、TOP 20とか簡単にレコードセットを絞れます。
TOP 20で訪問者上位20件を表示
Select TOP 20 URL, Count(URL) As URLCNT
と指定して、下記のSQL文を作成してみました。
Select TOP 20 URL, Count(URL) As URLCNT
From log
GROUP BY URL
ORDER BY Count(URL) DESC
単に、Selectの次にTOP 20としただけでした(オイオイ)
この指定だけで、TOP20のレコードセットを返してくれます。
SQL文 Select TOP 20 でGroup化集計値のTOP20を作成
http://www.ken3.org/cgi-bin/test/test083-1.asp
でテスト可能です。
/*
* 3.私が今ほしいのは、上位n件じゃなくて、21〜40件目のデータだけど
*/
TOPのキーワードを使うと、簡単にランキングをSQLで絞れそうなのがわかりました。
が、
私が探していたのは、
1ページ、20件単位の区切り(かたまり)
たとえば、
2ページ目のデータ、21件目〜40件目のデータ
を返す方法でした。
過去、
http://www.ken3.org/cgi-bin/test/test037-1.asp
では、
Set rs = db.Execute("Select * From log ORDER BY WriteTime DESC")
と、SQL文からレコードセットを作成して、
カウンタ変数を使用して、頭から30件になったらループを抜けてました。
'EOFまでループ or データ30件まで
nCNT = 1
Do While rs.EOF = False And nCNT <= 30 '.EOFがFalseで30以下の間
Response.Write "<TR>" '内容を表示する
・
・
rs.MoveNext 'これを忘れると悲惨なことに、、、
'カウンタを増やす
nCNT = nCNT + 1
Loop
こんな感じで、
Select * From log ORDER BY WriteTime DESC
↑書き込み時刻WriteTimeの降順(DESC指定)して作成したレコードセット
をループで回しつつ、カウントを取り、制御してました。
Select TOP 999 で結果のレコードセットを制御できるので、
下記のSQL文を発行してテストしてみました。
Select TOP 30 * From log ORDER BY WriteTime DESC
~~~~~~~~~
※なんか違和感あるよねSelect TOP 30 *ってのが、
トップさんじゅうアスタリスク?って感じでどこが切れ目だか・・
なれないと、TOPってフィールド名とか勘違いしそうです。
'Select TOP 30 と 件数を指定しました
Set rs = db.Execute("Select TOP 30 * From log ORDER BY WriteTime DESC")
・
・
'EOFまでループ
Do While rs.EOF = False '.EOFがFalseの間
と、レコードセットが指定した30件を返してくれるので、
カウンタで判断しないで、.EOFだけの判断としました。
SQL Select TOP 30 で 返って来るレコードセットを30件にする
http://www.ken3.org/cgi-bin/test/test083-2.asp
でテスト可能です。
/*
* 4.期待したのに出来なかった書き方(笑)
*/
さて、ここまで、ひっぱってきました(オイオイ)
期待したのに出来なかった書き方(笑)があって、(失敗したよ・・・)
そしたら、勝手な想像で、
^^^^^^^^^^^^^^^^^^^^^^^^
Select TOP 10 to 20
なんて感じで、書けないかなぁ・・と思ったら、ムリだった。。。
これが出来れば、21〜40もと思ったけど。
※もう少しSelect文の書き方、勉強しないとなぁ。。。
-- 余談 --
http://www.ken3.org/backno/backno_guchi36.html#181
で
TimeAddって関数を予想する力?
なんて、書いてたけど(注※TimeAddって関数は実際は無いので注意してね)
Select TOP 10 to 20
^^^^^^^^^^^^^^^^^^^
想像だけで、無かったです(笑)できなかった(爆)
まぁ、試行錯誤はタダだからいっかな。
~~~~~~~~~~~~~~~~~~~~
みなさんは、いろいろと試してみて成功してヤッターの感覚を味わってね。
※私は試行錯誤で、ヤッパダメか・・・が最近多い。
えっ、プログラマーの能力、見切りや予想の力が足りないって?
う〜ん・・・
http://www.ken3.org/backno/backno_guchi36.html#181
TimeAddって関数を予想する力?
を発展させて、プログラマーの予想能力について、偉そうに書いてみようかなぁ。
愚痴マガ http://www.ken3.org/guchi/ もヨロシクです。
/*
* 5.全体のn%のレコードを返す Top n PERCENT
*/
おまけで発見した、もう一つの指定方法
Select TOP 10 PERCENT
これは、全体から頭10%を取得してくれます。
Select TOP 10 PERCENT URL, Count(URL) As URLCNT
From log
GROUP BY URL
ORDER BY Count(URL) DESC
と、SQLを作成して、発行してみました。
http://www.ken3.org/cgi-bin/test/test083-3.asp
で、テスト表示を行ってます。
SQL、いろいろと書けるんですね。
-【けんぞう!】---------------------------------------------------------
ASPが利用可能なレンタルサーバーをお探しのアナタ、
http://www.ken3.org/asp/server.html ← けんぞうも使っているサーバーの紹介
『おっIISでbasp21でメール送信、mdbも使えるよ』(三流PG:31歳)
------------------------------------------------------------------------
/*
* 5.終わりの挨拶 </HTML>
*/
今回は、
SQL文のSelect TOPの使い方でした。
狙っていた本題の20〜40の途中のレコード表示までは、いかなかったです。
いろいろと問題点を残しつつ、脱線・寄り道の多いメルマガですが、
今後とも、よろしくお願いします。
何かの参考となれば幸いです。
ASP、VBScript勉強中の三流プログラマーのKen3でした。
フィードバック
ASP系の→[掲示板]←を覗く、質問を書き込む
評価・感想
三流君の主なリンク先
[アクセスランキング]
[サイトマップ]
[リンク先・相互リンク先など]
Ken3の日記(weblog) --
[広告・副収入系]
[プログラマー業務の愚痴]
[VBA系の話題]
[ASP系の話題]
[コンビニ系ネタ]
[その他]
その他 宣伝広告