2011年1月 7日

[pgsql-jp: 40653]order by asc offset limit での並び順について

オハラと申します。

PostgreSQL-8.4.2
Linux(2.6.18-128.el5)

あるテーブルから20行ずつデータを取り出して、アプリ側で
ページングするようにしています。
SQLはこんな感じです。

SELECT * FROM member WHERE status=0 and seg!='' ORDER BY seg ASC OFFSET 20 LIMIT 20
SELECT * FROM member WHERE status=0 and seg!='' ORDER BY seg ASC OFFSET 40 LIMIT 20

seg 列は重複ありで、seg 列の値が同じデータが20件あります。
それらデータが、(アプリ側で)2ページ目と3ページ目に分かれているとき、
2ページ目で表示されていたデータのいくつかが、3ページ目に現れます。
2ページ目と3ページ目に表示されている当該データを数えると20件あるので
あるデータは表示されていないことになります。
また、表示されていないデータは常に表示されません。つまり2ページ目の
リストも3ページ目のリストも並びは固定されています。

この現象は仕様なのでしょうか。

もちろん、ページを跨がないときは正常に全てのデータが表示されます。
また、降順にすると
SELECT * FROM member WHERE status=0 and seg!='' ORDER BY seg DESC OFFSET 20 LIMIT 20
再現できません。つまり、期待通りに表示されます。

ソートする列を追加して user_id ASC すると(user_id はユニーク)正常に
表示されます。
SELECT * FROM member WHERE status=0 and seg!='' ORDER BY seg ASC, user_id ASC OFFSET 20 LIMIT 20

以上、これら現象に遭遇して不思議に思い、皆様のご意見をお伺いしたく
質問させていただきました。
どうぞよろしくお願いいたします。
--
apostleofwhom <apostleofwhom@xxxxx>


投稿者 xml-rpc : 2011年1月 7日 02:06
役に立ちました?:
過去のフィードバック 平均:(0) 総合:(0) 投票回数:(0)
本記事へのTrackback: http://hoop.euqset.org/blog/mt-tb2006.cgi/101162
トラックバック
コメント
コメントする




画像の中に見える文字を入力してください。