我正在尝试使用以下查询在 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_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 支持进行了彻底修改,可产生所需的结果,并且正是用于生成上述结果的内容。