SQLITE json_group_array 排序

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

我正在尝试使用以下查询在 SQLite 中获取嵌套的 JSON 数组:

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))
                    FROM files f
                    WHERE f.trip = t.id ORDER BY f.id ASC)
        )
    )
FROM trips t
WHERE t.year IN (SELECT id FROM years WHERE id=1)
ORDER BY t.id ASC;

给出以下输出:

[
    {
        "trip_id": 2,
        "trip_desc": "trip2",
        "trip_files": [
            {
                "file_id": 3,
                "file_desc": "file3"
            },
            {
                "file_id": 4,
                "file_desc": "file4"
            }
        ]
    },
    {
        "trip_id": 1,
        "trip_desc": "trip1",
        "trip_files": [
            {
                "file_id": 2,
                "file_desc": "file2"
            },
            {
                "file_id": 1,
                "file_desc": "file1"
            }
        ]
    }
]

正如您所注意到的,

ORDER BY
子句被忽略。您也可以在以下 DBFiddle 中看到该问题:

https://www.db-fiddle.com/f/bnjzbLUUoQFWAinMdQqovG/0

关于如何完成订购有什么想法吗?谢谢!

json sqlite
1个回答
0
投票

对于像json_group_array()这样的

聚合函数
,“如果没有指定
ORDER BY
子句,聚合的输入会以任意顺序发生,从一次调用到下一次调用可能会发生变化。” sqlite 3.44 中添加了对聚合函数中
ORDER BY
的支持(比 db-fiddle 使用的版本更新(截至撰写本文时为 3.39))。
SELECT
ORDER BY
是无关紧要的;重要的是聚合函数调用中的那个。

所以你需要这样的查询

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)
                    FROM files f
                    WHERE f.trip = t.id)
        ) ORDER BY t.id)
FROM trips t
WHERE t.year IN (SELECT id FROM years WHERE id=1);

给出(通过 JSON 格式化程序运行后):

[
  {
    "trip_id": 1,
    "trip_desc": "trip1",
    "trip_files": [
      {
        "file_id": 1,
        "file_desc": "file1"
      },
      {
        "file_id": 2,
        "file_desc": "file2"
      }
    ]
  },
  {
    "trip_id": 2,
    "trip_desc": "trip2",
    "trip_files": [
      {
        "file_id": 3,
        "file_desc": "file3"
      },
      {
        "file_id": 4,
        "file_desc": "file4"
      }
    ]
  }
]

我在测试一个答案时注意到,使用 sqlite 3.44,

json_group_array(json expression ORDER BY expression)
会将
json expression
部分转换为 JSON 字符串,即使它以数组或对象等其他类型开始,这使得它几乎无法使用。 Sqlite 3.45 对其 JSON 支持进行了彻底修改,可产生所需的结果,并且正是用于生成上述结果的内容。

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