2017-05-26 106 views
0

我想知道如何运行查询来检查并查看是否有人列在其他人下。一个例子就像一个团队。有一个领导和领导下的人。我需要运行一个查询来查看某个名字是否在别人下面列出。SQL检查任何列中是否存在值并返回另一列中列出的值

我有下面的表:

  • ID;
  • Leader_FirstName;
  • Leader_LastName;
  • Member1_FN;
  • Member1_LN;
  • Member2_FN;
  • Member2_LN,等...

我需要检查整个表,如果该名称作为任何成员的存在,将返回Leader_FirstNameLeader_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... 
      ) 

任何想法?

+1

这里有一个想法:标准化的数据模型。对于Member1_,Member2_,Member3_等,而不是单独的列,而是为每个成员使用第二个具有单独行的表。根据你当前的模型,从你的查询中删除这个部分...'EXISTS(SELECT * FROM team WHERE'。 – spencer7593

+1

这是一个规范化问题,我忘记了它是哪种规范形式,但是你不应该在记录中重复 – MPelletier

+0

一个团队的领导可以成为另一个团队的成员吗?如果是,请参阅嵌套集合。如果不是,请参见邻接列表 – Strawberry

回答

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... 
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有以下的列:

  • ID
  • Leader_FirstName
  • Leader_LastName
  • Member_FN
  • Member_LN

负责信息w ^在许多行上都有不良记录,这是这种结构的主要缺点。为了避免这个问题,你可以尝试遵循方法。

2.两个表:leadermember

leader与下列:

  • ID
  • 名字

TABL Ëmember与下列:

  • ID
  • 名字
  • LeaderID

现在,您可以加入leadermember找到成员的领导者。

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...) 
+0

还有其他方法 – Strawberry

相关问题