在我看来,这个数据模型,一行记录一个领导者和所有成员,还有查询它没有什么好办法。
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