SQLについて質問です。


検索画面にてページング機能を実装しています。
DBにAccessを使用しているためLimit句が使用できずTOP句で代用しています。

SELECT TOP 30 * FROM テーブル名 WHERE (KANRI_NO >= (SELECT MAX(KANRI_NO) FROM
(SELECT TOP 1 * FROM テーブル名 ORDER BY KANRI_NO,EDA_NO))) ORDER BY KANRI_NO,EDA_NO;
(「TOP 1」の部分が、2ページ目だと「TOP 31」、3ページ目だと「TOP 61」と変化)
(実際は検索ボックスの入力値により様々な条件が付随してきます)

上記SQL文により、ソート順は望む通りに下記のように表示されます。
KANRI_NO,EDA_NO
11111, 1
11111, 2
22222, 1
ですが、ユーザから「最新が上にくるようにしてほしい」と要求があり悩んでいます。

上記SQL文をいじって(DESC、不等号の向きなど)試していますが、望むような動きになりません。「TOP句 逆」などで検索しても、いい答えは見つかりませんでした。
どなたかお知恵を拝借願います。

回答の条件
  • 1人5回まで
  • 13歳以上
  • 登録:2011/07/02 17:35:13
  • 終了:2011/07/03 01:47:01

ベストアンサー

id:Mook No.2

Mook回答回数1312ベストアンサー獲得回数3912011/07/02 19:28:45

ポイント70pt

最新のものが上ということは全体が逆順になると思うのですが、

例えば2ページを表示する例だと

SELECT TOP 30 * FROM テーブル名 WHERE (KANRI_NO >= (SELECT MIN(KANRI_NO) FROM
(SELECT TOP 60 * FROM テーブル名 ORDER BY KANRI_NO DESC, EDA_NO DESC))) ORDER BY KANRI_NO DESC, EDA_NO DESC;

のようにしてどうでしょうか。

DESC はそれぞれのフィールドに対して修飾が必要です。


VBA を使ってやるのであれば、30, 60 のあたりは変数を使ってできますし、

ADO で SEEK すれば単純にクエリ部は

SELECT * FROM テーブル名 ORDER BY KANRI_NO DESC, EDA_NO DESC

で求めておいて、31から60 までを取得するというコードにすることもできます。

http://msdn.microsoft.com/ja-jp/library/cc948692.aspx

http://jsajax.com/accessWeb/Chapter3/ch3-02.aspx


追伸:

先の質問を見ると PHP からの呼び出しのようですが、現在のコードを

提示いただければ、もう少し具体的な回答ができると思います。

id:kentaro_jpn

>DESC はそれぞれのフィールドに対して修飾が必要です。

正にこの知識がなかったために、いろいろ考えたことを試してみても

期待値が得られずにお手上げ状態になっているところでした。

情報不足なわかりにくい質問をしてしまいましたが

的を射た回答をありがとうございました。

2011/07/03 01:45:48

その他の回答(1件)

id:freemann No.1

freemann回答回数304ベストアンサー獲得回数472011/07/02 18:04:45

ポイント30pt

何をもって最新とするのかがわかりませんが、なんとなくこんな感じにすればよいのではないでしょうか。

SELECT TOP 30 * FROM (SELECT * FROM テーブル名 WHERE (KANRI_NO >= (SELECT MAX(KANRI_NO) FROM

(SELECT TOP 1 * FROM テーブル名 ORDER BY KANRI_NO,EDA_NO))) ORDER BY KANRI_NO,EDA_NO DESC);

一つSELECT文をさらにラップする感じでいいのではないでしょうか。

id:Mook No.2

Mook回答回数1312ベストアンサー獲得回数3912011/07/02 19:28:45ここでベストアンサー

ポイント70pt

最新のものが上ということは全体が逆順になると思うのですが、

例えば2ページを表示する例だと

SELECT TOP 30 * FROM テーブル名 WHERE (KANRI_NO >= (SELECT MIN(KANRI_NO) FROM
(SELECT TOP 60 * FROM テーブル名 ORDER BY KANRI_NO DESC, EDA_NO DESC))) ORDER BY KANRI_NO DESC, EDA_NO DESC;

のようにしてどうでしょうか。

DESC はそれぞれのフィールドに対して修飾が必要です。


VBA を使ってやるのであれば、30, 60 のあたりは変数を使ってできますし、

ADO で SEEK すれば単純にクエリ部は

SELECT * FROM テーブル名 ORDER BY KANRI_NO DESC, EDA_NO DESC

で求めておいて、31から60 までを取得するというコードにすることもできます。

http://msdn.microsoft.com/ja-jp/library/cc948692.aspx

http://jsajax.com/accessWeb/Chapter3/ch3-02.aspx


追伸:

先の質問を見ると PHP からの呼び出しのようですが、現在のコードを

提示いただければ、もう少し具体的な回答ができると思います。

id:kentaro_jpn

>DESC はそれぞれのフィールドに対して修飾が必要です。

正にこの知識がなかったために、いろいろ考えたことを試してみても

期待値が得られずにお手上げ状態になっているところでした。

情報不足なわかりにくい質問をしてしまいましたが

的を射た回答をありがとうございました。

2011/07/03 01:45:48

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません