2013-05-14 58 views
3

我有以下的数据库模式:加入SQLite中的表有多对多

create table people (
    id integer primary key autoincrement, 
); 

create table groups (
    id integer primary key autoincrement, 
); 

,我已经有哪些人是在一个单独的文件,该文件组的成员(让我们在(person idgroup id元组说)。我怎样才能构建我的数据库模式,以便访问一个人的组,并且也容易访问一个组的成员?阅读我目前拥有的元组是很困难和缓慢的,所以我希望这是以数据库的形式,我不能有像member1,member2等这样的列作为列,因为组中的人数目前是无限的。

+1

请发布您尝试过的查询。 – Kermit 2013-05-14 18:11:24

+0

文件组中的成员(.txt,.php,.csv等)还是他们的另一个表groups_people – csi 2013-05-14 18:13:14

+0

@ChristopherIckes它们位于.txt文件中。 – jclancy 2013-05-14 18:15:06

回答

15

将文本文件导入到数据库表

CREATE TABLE groups_people (
    groups_id integer, 
    people_id integer, 
    PRIMARY KEY(group_id, people_id) 
); 

,并选择是第7组

SELECT * FROM people p 
    LEFT JOIN groups_people gp ON gp.people_id = p.id 
    WHERE gp.groups_id = '7'; 

的成员所有的人和选择所有组的那个人5是

SELECT * FROM groups g 
    LEFT JOIN groups_people gp ON gp.groups_id = g.id 
    WHERE gp.people_id = '5'; 
+1

+1对,一个n:m关系最好通过一个新表来实现 – Andomar 2013-05-14 18:19:30

+0

非常感谢!这是一个非常明确的答案,我非常喜欢它。我正在计划序列化组和会员资格,这是不那么优雅。一个问题:如果我有一个有N个成员并且有一个成员的团体的小组,那么这种方法是否会为所有有一个成员(假设N> 1)的团体创建N个空的“成员空间”?或者,SQL是否足够聪明,不会这样做? – jclancy 2013-05-14 18:27:23

+1

@jclancy:对于每个组员关系,您将在'groups_people'表中有1行。因此,对于有N个成员的组,该表中将有N行。对于有1个成员的组,只有1行。对于没有成员的组,在表中没有行。 – 2013-05-14 18:35:40