多对多关系没有重复的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.
我有两个 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.