我有下一个查询,什么返回给我的类别以及分配给它们的一组游戏。如何限制该数组中的游戏数量?
SELECT categories.*, COALESCE(jsonb_agg(g.*) FILTER (WHERE g.name IS NOT NULL), '[]') AS games FROM categories
LEFT JOIN games_categories gc ON categories.id = gc.category_id
LEFT JOIN games g ON gc.game_id = g.id
GROUP BY categories.id;
这可以使用 ROW_NUMBER() 函数为组中的每一行分配一个唯一的编号,然后仅选择每组中的前 N 行来完成:
-- This to get 2 elements per categories :
SELECT g.id, jsonb_agg (g.*) FILTER (WHERE g.name IS NOT NULL) AS categories
FROM (
SELECT *, row_number() OVER (PARTITION BY id ORDER BY name) as rn
FROM categories
) g
WHERE rn <=2
GROUP BY id
对于此数据集:
create table categories (
id int,
name varchar(10)
);
insert into categories values
(1, 'A'),
(1, 'B'),
(1, 'C'),
(1, 'D'),
(2, 'A'),
(2, 'B'),
(2, 'E');
结果:
id categories
1 [{"id": 1, "rn": 1, "name": "A"}, {"id": 1, "rn": 2, "name": "B"}]
2 [{"id": 2, "rn": 1, "name": "A"}, {"id": 2, "rn": 2, "name": "B"}]