2016-05-11 6 views
0

に基づいて範囲を選択するところ、このようなテーブルでは句

id | user | message 
___________________ 
0 | dan | ... 
1 | john | ... 
2 | dan | ... 
3 | dan | ... 
4 | john | ... 
(and so on) 

どのように私は後に100のメッセージへのidの前に100件のメッセージからダンのメッセージを選択することができますか? id列+/- 100に基づいて選択すると、他のユーザーのメッセージが途切れてしまう可能性があるため、両側で100になることは保証されません。私がSELECT * from table WHERE user = 'dan' and (some clause here) order by id;

データベースたいあなたはROW_NUMBER ...この

Select 
    ROW_NUMBER() over (paritition by user order by id) as 'mrnk' 
    ,id 
    ,user 
    ,message 
From table 
Where user = 'dan' 
and mrnk <= 100 

または何あなたが探しているダンのメッセージの数のようなものを使用することができますPostgresqlの

答えて

4

Hmmm。 。 。どの程度union all

(select m.* 
from messages m 
where user = 'dan' and id < $id 
order by id desc 
limit 100 
) union all 
(select m.* 
from messages m 
where user = 'dan' and id > $id 
order by id asc 
limit 100 
) 
order by id; 

これはさえ(user, id)のインデックスと合理的に効率的でなければなりません。

+0

これはまさに私が感謝したことです。最初のサブクエリでは順序が間違っていますが、descで順序を使用して必要な行を取得しますが、後にascで順序を並べ替えることはないので注意してください。クエリの最後に 'ORDER BY id'を投げる必要があります。 –

0

です!

+0

申し訳ありません... postgresqlタグに気付きました。この結果はSQLサーバクエリです。 postgresqlにも同じことが当てはまるかどうかは分かりません。 –

+0

'row_number()'もpostgresqlに存在します。FYI – Rahul

関連する問題