2013-08-19 88 views
1

我有簡單的SQL查詢:SQL SELECT ... WHERE與獨立LIMIT,OFFSET子句

SELECT * FROM t1 
WHERE status = 1 AND user_id = ? AND some_field NOT IN (?, ?, ..., ?) 
ORDER BY createdAt DESC, rating DESC 
LIMIT 10 OFFSET 0; 

但我想沒有循環在我的PHP代碼完成對接入用戶的集合類似的查詢。看起來我需要在user_id =中使用IN子句?條件(user_id IN(?,...?))和單獨的LIMIT,OFFSET子句,用於user_id IN子句中的每個id。我知道這是不可能的,但也許存在任何解決方法而不會降低我的查詢性能?

我使用PostgreSQL 9.0.3,我假設也可以使用存儲過程來解決這個問題。

+0

第一:9.0.3?!?您在許多重要的修補程序版本中都落後,包括重要的安全更新。現在升級。請參閱http://www.postgresql.org/support/versioning/,http://www.postgresql.org/support/security/faq/2013-04-04/ –

+1

至於它的自我問題,我找到很難弄清究竟是什麼問題,你想要解決什麼問題。 –

+0

我根本沒有得到這個問題,你是否試圖通過10行或什麼來獲取數據? –

回答

2
select * 
from (
    select *, 
     row_number() over(
      partition by user_id 
      order by createdat desc, rating desc 
     ) as rn 
    from t1 
    where 
     status = 1 and some_field not in (?, ?, ..., ?) 
     and user_id in (1,2,3) 
) s 
where rn <= 10 
order by user_id, rn 

窗口功能:

http://www.postgresql.org/docs/current/static/functions-window.html

http://www.postgresql.org/docs/current/static/sql-expressions.html#SYNTAX-WINDOW-FUNCTIONS

http://www.postgresql.org/docs/current/static/tutorial-window.html

+0

看起來像一個魔術!嘗試使用它。那麼這個查詢的性能呢? –

+0

@Ostrovski窗口功能很貴。要了解更多有關postgresql查詢成本的信息,請查找'explain' –

+0

哦,它太慢了。我的循環選擇它的速度大約快10倍,即使我在單獨的查詢中也這樣做了。 –