内部加入 table 使用限制

Inner join a table using limit

我在 collectionsimages 表之间有一个 1-n 关系。

我的目标是select给定条件的所有集合以及找到的任何集合的前 3 个图像。

我现在是怎么做的:

集合查询:

SELECT * FROM "collections" WHERE SOME_CONDITION

在 select 所有集合之后,我 运行 对每个集合进行这样的查询:

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。

这可以使用 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() 仅适用于 stable 方式。上面语句中的 somethingimages table 中的任何列,这将使您能够正确地对这些行进行排序,例如最后修改日期,或创建日期或类似的东西。您显然需要用现有列替换 something