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

SQLite中json_group_array排序失效问题求助

解决SQLite嵌套JSON数组排序失效问题

在SQLite中,json_group_array不会自动继承外层查询的排序规则,必须确保聚合前的数据已按预期排序,同时内层子查询的排序逻辑也需要正确传递给聚合函数。以下是两种可行的修正方案:

方案一:提前排序再聚合(兼容所有SQLite版本)

SELECT json_group_array( 
        json_object(
            'trip_id', t.id, 
            'trip_desc', t.desc,
            'trip_files', (
                SELECT json_group_array(file_obj)
                FROM (
                    SELECT json_object('file_id', f.id, 'file_desc', f.desc) AS file_obj
                    FROM files f
                    WHERE f.trip = t.id 
                    ORDER BY f.id ASC
                ) sorted_files
            )
        )
    )
FROM (
    SELECT * 
    FROM trips t
    WHERE t.year IN (SELECT id FROM years WHERE id=1)
    ORDER BY t.id ASC
) sorted_trips
;

关键调整点

  • 外层Trip排序:通过子查询sorted_trips先对trips数据按id升序排序,再传入json_group_array聚合,确保外层JSON数组按trip_id顺序生成。
  • 内层Files排序:新增子查询sorted_files,先对files按id升序排序并生成单个文件的JSON对象,再将排序后的结果传入json_group_array,避免聚合函数忽略原排序规则。

方案二:使用json_group_array内置排序(SQLite 3.33.0+)

如果你的SQLite版本在3.33.0及以上,可以直接利用json_group_array的内置排序参数,写法更简洁:

SELECT json_group_array( 
        json_object(
            'trip_id', t.id, 
            'trip_desc', t.desc,
            'trip_files', (
                SELECT json_group_array(
                    json_object('file_id', f.id, 'file_desc', f.desc),
                    ORDER BY f.id ASC
                )
                FROM files f
                WHERE f.trip = t.id
            )
        ),
        ORDER BY t.id ASC
    )
FROM trips t
WHERE t.year IN (SELECT id FROM years WHERE id=1)
;

这种写法直接在json_group_array函数内指定排序规则,无需额外嵌套子查询,逻辑更直观。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 14:21:02