Mysql SQL检查任何列中是否存在值,并返回另一列中列出的值
我想知道如何运行查询来检查某人是否列在其他人的下面。一个例子就是一个团队。有一个团队领导和领导下的人员。我需要运行一个查询,以查看是否在其他人的下面列出了一个名称 我有一个包含以下列的表:Mysql SQL检查任何列中是否存在值,并返回另一列中列出的值,mysql,sql,sql-server,Mysql,Sql,Sql Server,我想知道如何运行查询来检查某人是否列在其他人的下面。一个例子就是一个团队。有一个团队领导和领导下的人员。我需要运行一个查询,以查看是否在其他人的下面列出了一个名称 我有一个包含以下列的表: ID 领导者的名字 领导者的姓氏 成员1_FN 成员1_LN 成员2_FN 成员2\u LN等 我需要检查整个表,如果该名称作为任何成员存在,它将返回Leader\u FirstName和Leader\u LastName的值 我一直在尝试使用“WHERE EXISTS”,比如: 有什么想法吗?试试这个
- ID李>
- 领导者的名字李>
- 领导者的姓氏李>
- 成员1_FN李>
- 成员1_LN李>
- 成员2_FN李>
- 成员2\u LN等
Leader\u FirstName
和Leader\u LastName
的值
我一直在尝试使用“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...
在我看来,对于这个数据模型,一行记录一个领导者和所有成员,没有好的方法来查询它
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
包含以下列:
- 身份证
- 领导的名字
- 领导姓氏
- 成员(FN)
- 委员
leader
和member
表leader
包含以下列:
- 身份证
- 名字
- 姓氏
成员
,包含以下列:
- 身份证
- 名字
- 姓氏
- 利德里德
leader
和member
以查找成员的leader
3。一个表团队
与关系
表团队
与成员
相同,如下所示:
- 身份证
- 名字
- 姓氏
- LeaderID(对于leader为空)
团队和自己
使用以上结构,如何查询?我认为,您可以使用名称中未出现的分隔符char将FirstName和LastName转换为字符串,然后在
中使用进行比较,例如:
对于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等使用单独的列。使用第二个表,为每个成员使用单独的行。就当前模型而言,请从查询中删除此部分<代码>存在(选择*FROM team WHERE
。这是一个规范化问题。我忘了它是哪种规范化形式,但你不应该在这样的记录中重复。一个团队的领导者是否可以是另一个团队的成员?如果是,请参阅嵌套集。如果不是,请参阅邻接列表。还有其他方法
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...)