[pgsql-jp: 40653] order by asc offset limit での並び順について
apostleofwhom
apostleofwhom @ gmail.com
2011年 1月 7日 (金) 02:06:07 JST
オハラと申します。
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 @ gmail.com>
pgsql-jp メーリングリストの案内