1

私は単純なSQLクエリを持っています:

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 句。それが不可能であることはわかっていますが、クエリのパフォーマンスを低下させずに回避策が存在する可能性がありますか?

私は PostgreSQL 9.0.3 を使用しており、この問題を解決するためにストアド プロシージャを使用する可能性も想定しています。

4

1 に答える 1

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

于 2013-08-19T12:29:04.527 に答える