多对多关系没有重复的sqlite结果

No repeated sqlite results for many to many relationship

我有两个 table(线程和用户)

CREATE TABLE users (id integer primary key, email text);
CREATE TABLE "threads"(id integer primary key not null, name text);

由于用户可以有多个线程,并且每个线程可以有多个用户,我想在它们之间创建多对多关系。

所以,我正在创建另一个 table(会员资格):

CREATE TABLE membership (
    id integer primary key, 
    thread_id integer, 
    user_id integer, 
    foreign key (thread_id) references threads (id), 
    foreign key (user_id) references users (id)
);

我可以通过此查询获得所有线程及其相关成员资格:

SELECT * FROM threads t LEFT JOIN membership ms ON ms.thread_id = t.id;

id          type        name           id          thread_id   user_id   
----------  ----------  -------------  ----------  ----------  ----------
1           1           aweseom group  4           1           1         
1           1           aweseom group  3           1           3         
1           1           aweseom group  6           1           4         
2           1           new group      5           2           4  

或者我可以通过此查询获取所有用户及其相关成员资格:

SELECT * FROM users u LEFT JOIN membership ms ON ms.user_id = u.id;

id          email           id          thread_id   user_id   
----------  --------------  ----------  ----------  ----------
1           first@mail.com  4           1           1         
3           third@mail.com  3           1           3         
4           kakar@gmail.co  6           1           4         
4           kakar@gmail.co  5           2           4    

如您所见,在这两种情况下,线程和用户都是重复的。由于我将在我的 React Native 项目 (using Expo's SQLite module) 中使用 SQL 结果,并且线程的 ID 或用户的 ID 将用作键,是否有任何方法可以避免重复的结果集,以便我可以终于有了这样的结果:

线程:

[
    {
        "id": 1,
        "members": [
            {
                "id": 1,
                "email": "first@mail.com"
            },
            {
                "id": 3,
                "email": "three@mail.com"
            },
            {
                "id": 4,
                "email": "kakar@gmail.com"
            }
        ],
        "name": "awesome group",
    },
    {
        "id": 2,
        "members": [
            {
                "id": 4,
                "email": "kakar@gmail.com"
            }
        ],
        "name": "new group",
    }
]

一个查询输出一个table(具有固定的列数和行数)。你想要的没有table.

的形式

只需使用一个查询来读取线程,然后为每个线程执行一个查询来读取相应的成员。这需要 N+1 个查询,但是在 SQLite 中,这个 is not a problem.