内部使用限制连接表

时间:2015-10-19 09:28:05

标签: sql postgresql inner-join greatest-n-per-group

我在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。

1 个答案:

答案 0 :(得分:3)

这可以使用window function

来完成
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()。上面语句中的somethingimages表中的任何列,可以让您对这些行进行正确排序,例如最后修改日期,或创建日期或类似的东西。您显然需要将something替换为现有列。