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