在我看來,這個數據模型,一行記錄一個領導者和所有成員,還有查詢它沒有什麼好辦法。
SELECT * FROM team
WHERE (Member1_FN = '$member_fName' AND Member1_LN = '$member_lName')
OR (Member2_FN = '$member_fName' AND Member2_LN = '$member_lName')
OR (... etc...
這相當於你的SQL,但不好。
我覺得這個表結構是不合理的。表中的列數取決於領導者的最大成員數量。如果添加一些成員,則必須更改表結構以添加一些列。它不夠靈活。
有很多方法來優化結構。
1。一行一個成員
表team
有以下的列:
- ID
- Leader_FirstName
- Leader_LastName
- Member_FN
- Member_LN
負責信息w ^在許多行上都有不良記錄,這是這種結構的主要缺點。爲了避免這個問題,你可以嘗試遵循方法。
2.兩個表:leader
和member
表leader
與下列:
TABL Ëmember
與下列:
現在,您可以加入leader
和member
找到成員的領導者。
3.一個表team
與關係
team
表是相同與member
如下:
- ID
- 姓
- 名字
- LeaderID(對於前導是NULL)
現在,加入team
和它本身。
使用上面的結構,如何查詢?我想,你可以Concat的名字和姓氏與不爲名出現的字符串的分隔符字符,不是使用IN
來比較它,例如:
爲1:
SELECT *
FROM team
WHERE CONCAT_WS(',', Member_FN, Member_LN)
IN (CONCAT_WS(',', '$member1_fName', '$member1_fName'),
CONCAT_WS(',', '$member2_fName', '$member2_fName'),
...etc...)
對於2:
SELECT *
FROM leader, member
WHERE leader.ID = member.LeaderId and CONCAT_WS(',', member.FirstName, member.LastName)
IN (CONCAT_WS(',', '$member1_fName', '$member1_fName'),
CONCAT_WS(',', '$member2_fName', '$member2_fName'),
...etc...)
爲3:
SELECT *
FROM team a, team b
WHERE a.ID = b.LeaderId and CONCAT_WS(',', b.FirstName, b.LastName)
IN (CONCAT_WS(',', '$member1_fName', '$member1_fName'),
CONCAT_WS(',', '$member2_fName', '$member2_fName'),
...etc...)
這裏有一個想法:標準化的數據模型。對於Member1_,Member2_,Member3_等,而不是單獨的列,而是爲每個成員使用第二個具有單獨行的表。根據你當前的模型,從你的查詢中刪除這個部分...'EXISTS(SELECT * FROM team WHERE'。 – spencer7593
這是一個規範化問題,我忘記了它是哪種規範形式,但是你不應該在記錄中重複 – MPelletier
一個團隊的領導可以成爲另一個團隊的成員嗎?如果是,請參閱嵌套集合。如果不是,請參見鄰接列表 – Strawberry