内部加入 table 使用限制
Inner join a table using limit
我在 collections
和 images
表之间有一个 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 方式。上面语句中的 something
是 images
table 中的任何列,这将使您能够正确地对这些行进行排序,例如最后修改日期,或创建日期或类似的东西。您显然需要用现有列替换 something
。
我在 collections
和 images
表之间有一个 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 方式。上面语句中的 something
是 images
table 中的任何列,这将使您能够正确地对这些行进行排序,例如最后修改日期,或创建日期或类似的东西。您显然需要用现有列替换 something
。