2013-05-14 54 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