2015-10-19 50 views
1

我有collectionsimages表之间的1-n关系。内部加入表使用限制

我的目标是选择所有集合,并给出一个条件以及找到的任何集合的前3个图像。

我怎么现在就这样做:在集合

查询:

SELECT * FROM "collections" WHERE SOME_CONDITION 

选择所有集合后,我运行这样的查询为每个集合:

SELECT * FROM "images" WHERE "images"."collection_id" = MY_CURRENT_COLLECTION_ID LIMIT 3 

我的目标是在一个查询中做到这一点:

SELECT "images".* 
    ,"collections".* 
FROM "collections" 
INNER JOIN (SOME_MAGIC_TO_GET_THE_TOP_THREE_IMAGES_FOR_EACH_COLLECTION) AS "images" ON "images"."collection_id" = "collections"."id" 
WHERE SOME_CONDITION 

有什么想法?

P.S.我正在使用postgresql。

SELECT img.*, 
     collections.* 
FROM collections 
    JOIN (
    select *, 
      row_number() over (partition by collection_id order by something) as rn 
    from images 
) img ON img.collection_id = collections.id AND img.rn <= 3 
WHERE ....; 

注意分配ROW_NUMBER()只能在一个稳定的方式,如果你可以通过一些命令行:

回答

3

这可以使用window function来完成。以上声明中的something是您的images表中的任何列,可以使您正确对这些行进行排序,例如,最后修改日期或创建日期或类似内容。您显然需要用现有列替换something