我试图找出如何运行查询来检查并查看某人是否列在其他人之下。一个例子就像一个团队。该领导下有一个团队领导和人员。我需要运行一个查询来查看某个名字是否列在其他人之下。
我有一个包含以下列的表:
我需要检查整个表格,如果该名称作为任何成员存在,它将返回Leader_FirstName
和Leader_LastName
的值。
我一直试图使用" WHERE EXISTS"像:
SELECT * FROM team
WHERE EXISTS (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...
)
有什么想法吗?
答案 0 :(得分:0)
试试这个
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...
答案 1 :(得分:0)
在我看来,对于这个数据模型,一行记录一个领导者和所有成员,没有好的方法来查询它。
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
,其中包含以下列:
领导者信息将记录在许多行,这是此结构的主要缺点。为了避免此问题,您可以尝试按照方法。
<强> 2。两个表格:leader
和member
表leader
包含以下列:
表member
包含以下列:
现在,您可以加入leader
和member
以找到会员的领导者。
第3。一个表team
,关系
表team
与member
相同,如下所示:
现在,加入team
和它自己。
使用上面的结构,如何查询?我认为,您可以将FirstName和LastName与名称中未出现的分隔符char连接起来,而不是使用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...)