如何限制来自内部连接的数组中的项目数量?

问题描述 投票:0回答:1

我有下一个查询,什么返回给我的类别以及分配给它们的一组游戏。如何限制该数组中的游戏数量?

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;
sql postgresql
1个回答
0
投票

这可以使用 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"}]

演示在这里

© www.soinside.com 2019 - 2024. All rights reserved.