You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何限制关联查询返回的分类对应游戏数组的元素数量?

问题描述

有如下SQL查询,该查询返回分类信息以及与之关联的游戏数组。请问如何限制每个分类对应游戏数组中的游戏数量?

原SQL代码:

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;
解决方案

要实现每个分类只返回指定数量的游戏,核心思路是先给每个分类下的游戏按规则排序编号,过滤掉超出数量限制的条目后再聚合为JSON数组。以下以每个分类最多返回3个游戏为例:

SELECT 
    categories.*,
    COALESCE(jsonb_agg(filtered_games.*) FILTER (WHERE filtered_games.name IS NOT NULL), '[]') AS games
FROM categories
LEFT JOIN (
    -- 子查询为每个分类下的游戏排序并编号
    SELECT 
        gc.category_id,
        g.*,
        ROW_NUMBER() OVER (PARTITION BY gc.category_id ORDER BY g.id) AS rn
        -- 可替换排序规则,比如按发布日期倒序:ORDER BY g.release_date DESC
    FROM games_categories gc
    JOIN games g ON gc.game_id = g.id
) AS filtered_games ON categories.id = filtered_games.category_id
WHERE filtered_games.rn <= 3 OR filtered_games.rn IS NULL
GROUP BY categories.id;

关键细节说明:

  • ROW_NUMBER() OVER (PARTITION BY gc.category_id ORDER BY ...):通过PARTITION BY按分类分组,ORDER BY指定游戏的排序逻辑(可根据业务需求替换为游戏名称、热度等字段),给每个分类下的游戏生成唯一编号。
  • WHERE filtered_games.rn <= 3 OR filtered_games.rn IS NULL:既保留每个分类内前3个游戏,也确保没有关联游戏的分类能正常返回空数组[]。
  • 若要调整游戏数量,只需修改<=后的数字即可。

内容的提问来源于stack exchange,提问作者YURII

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 06:53:16