【问题标题】:Aggregate SQLite query across multiple tables using JSON1使用 JSON1 跨多个表聚合 SQLite 查询
【发布时间】:2020-05-03 02:30:15
【问题描述】:

我无法解决以下问题。前几天我学习了如何使用 JSON1 系列函数,但这一次似乎更像是一个 SQL 问题。

这是我的数据库设置:

CREATE TABLE persons(id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT UNIQUE)
CREATE TABLE interests(id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT UNIQUE)
CREATE TABLE persons_interests(person INTEGER, interest INTEGER, FOREIGN KEY(person) REFERENCES persons(id), FOREIGN KEY(interest) REFERENCES interests(id))

INSERT INTO persons(name) VALUES('John')
INSERT INTO persons(name) VALUES('Jane')

INSERT INTO interests(name) VALUES('Cooking')
INSERT INTO interests(name) VALUES('Gardening')
INSERT INTO interests(name) VALUES('Relaxing')

INSERT INTO persons_interests VALUES(1, 1)
INSERT INTO persons_interests VALUES(1, 2)
INSERT INTO persons_interests VALUES(2, 3)

基于这些数据,我想得到以下输出,将所有人的所有兴趣汇总到一个 JSON 数组中:

[{name: John, interests:[{name: Cooking},{name: Gardening}]}, {name: Jane, interests:[{name: Relaxing}]}]

现在以下是我尝试做的事情。不用说,这并没有给我想要的:

SELECT p.name, json_object('interests', json_group_array(json_object('name', i.name))) interests
FROM persons p, interests i
JOIN persons_interests pi ON pi.person = p.id AND pi.interest = i.id

不想要的输出是:

John|{"interests":[{"name":"Cooking"},{"name":"Gardening"},{"name":"Relaxing"}]}

非常感谢任何帮助!

【问题讨论】:

    标签: sql sqlite sqlite-json1


    【解决方案1】:

    对于使用json_group_array,您必须按人对行进行分组,除非您只希望一行包含所有结果。

    示例 1)

    第一个版本,将按人为您提供 1 个 json 对象,因此结果将为 N 人的 N 行:

    SELECT json_object( 'name ',
                        p.name, 
                        'interests', 
                        json_group_array(json_object('name', i.name))) jsobjects
    FROM persons p, interests i
    JOIN persons_interests pi ON pi.person = p.id AND pi.interest = i.id
    group by p.id ;
    

    示例 2)

    第二个版本,将返回 1 个包含所有人的大 json 数组,但您只获取一行。

    SELECT json_group_array(jsobjects) 
    FROM (
    
        SELECT json_object( 'name ',
                            p.name, 
                            'interests', 
                            json_group_array(json_object('name', i.name))) jsobjects
        FROM persons p, interests i
        JOIN persons_interests pi ON pi.person = p.id AND pi.interest = i.id
        group by p.id 
    ) jo ;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-09-01
      • 2013-08-22
      • 1970-01-01
      • 2019-05-07
      • 2018-12-18
      • 2013-03-05
      • 1970-01-01
      相关资源
      最近更新 更多