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)
  • 委员
引线信息将记录在多行中,这是此结构的主要缺点。为了避免此问题,您可以尝试以下方法

2。两个表:
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...)