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

Itagaki Takahiro itagaki.takahiro @ gmail.com
2011年 1月 7日 (金) 03:01:16 JST


2011/1/7 apostleofwhom <apostleofwhom @ gmail.com>:
> 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件あります。

ソートキーに重複 (同じ値) ガある場合には、それらの順序は不定です。
なので、実行するたびに結果が異なるのは仕様と言えます。
# 内部的なソートアルゴリズムは、クイック・ソートと呼ばれるものです。

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

ページングする場合には、このようにソートキーの組み合わせ全体で
ユニークになるような列を指定してください。

-- 
Itagaki Takahiro


pgsql-jp メーリングリストの案内