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

如何在SQLite中查询分组关联表并返回JSON格式结果

SQLite查询:将关联表数据汇总为JSON格式结果

表结构说明

假设有三张表:

人员表 people

+----+------+
| id | name |
+----+------+
|  1 | John |
|  2 | Mary |
|  3 | Jane |
+----+------+

衣物表(以鞋子表shoes为例,其他衣物表结构类似)

+----+----------+--------------------+---------+
| id |  brand   |        name        |  type   |
+----+----------+--------------------+---------+
|  1 | Converse | High tops          | sneaker |
|  2 | Clarks   | Tilden cap Oxfords | dress   |
|  3 | Nike     | Air Zoom           | running |
+----+----------+--------------------+---------+

关联表(存储人员与衣物的拥有关系)

+--------+--------+-------+-------+
| person | shirts | pants | shoes |
+--------+--------+-------+-------+
|      1 |      3 |       |       |
|      1 |      4 |       |       |
|      1 |        |     3 |       |
|      1 |        |       |     5 |
|      2 |        |     2 |       |
|      2 |        |       |     2 |
|      2 |      3 |       |       |
...

需求

编写SQLite查询语句,将关联表数据汇总为如下格式:

+----+------+--------------------+
| id | name |   clothing items   |
+----+------+--------------------+
|  1 | John | [JSON字符串格式]    |
|  2 | Mary | [JSON字符串格式]    |
|  3 | Jane | [JSON字符串格式]    |
+----+------+--------------------+

其中clothing items列的JSON格式示例:

{
  "shirts":[3,4],
  "pants":[3],
  "shoes":[5]
}

实现语句

注意:SQLite 3.33.0及以上版本支持JSON_OBJECT、JSON_GROUP_ARRAY等JSON聚合函数,若版本低于此需先升级。

查询语句如下:

SELECT
  p.id,
  p.name,
  JSON_OBJECT(
    'shirts', COALESCE((SELECT JSON_GROUP_ARRAY(shirts) FROM 关联表 WHERE person = p.id AND shirts IS NOT NULL), '[]'),
    'pants', COALESCE((SELECT JSON_GROUP_ARRAY(pants) FROM 关联表 WHERE person = p.id AND pants IS NOT NULL), '[]'),
    'shoes', COALESCE((SELECT JSON_GROUP_ARRAY(shoes) FROM 关联表 WHERE person = p.id AND shoes IS NOT NULL), '[]')
  ) AS "clothing items"
FROM people p
LEFT JOIN 关联表 r ON p.id = r.person
GROUP BY p.id, p.name;

语句说明

  • JSON_OBJECT:构建最终的JSON对象,键为衣物类型,值为对应的ID数组。
  • JSON_GROUP_ARRAY:将同一人员的同类型衣物ID聚合为JSON数组。
  • COALESCE:处理无对应衣物的情况,返回空数组[]而非NULL。
  • LEFT JOIN + GROUP BY:确保即使人员没有任何衣物记录(如Jane),也会出现在结果中。

如果关联表有重复的衣物ID(如Mary的pants记录有两条2),若需要去重可以使用JSON_GROUP_ARRAY(DISTINCT pants)替代JSON_GROUP_ARRAY(pants)。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 18:16:38