2013-08-19 11 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 (?, ...?)) 및 user_id IN 절의 각 id에 대해 LIMIT, OFFSET 절을 구분하십시오. 그게 가능하지 않습니다,하지만 어쩌면 내 쿼리의 성능을 떨어 뜨리지 않고 어떤 workarounds 존재합니까?

저는 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 배 빠름을 선택합니다. –