SQL检查任何列中是否存在值并返回另一列列出的值

时间:2017-05-26 03:59:48

标签: mysql sql sql-server

我试图找出如何运行查询来检查并查看某人是否列在其他人之下。一个例子就像一个团队。该领导下有一个团队领导和人员。我需要运行一个查询来查看某个名字是否列在其他人之下。

我有一个包含以下列的表:

  • 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...
              )

有什么想法吗?

2 个答案:

答案 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,其中包含以下列:

  • ID
  • Leader_FirstName
  • Leader_LastName
  • Member_FN
  • Member_LN

领导者信息将记录在许多行,这是此结构的主要缺点。为了避免此问题,您可以尝试按照方法。

<强> 2。两个表格:leadermember

leader包含以下列:

  • ID
  • 名字

member包含以下列:

  • ID
  • 名字
  • LeaderID

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

第3。一个表team,关系

teammember相同,如下所示:

  • ID
  • 名字
  • LeaderID(对于leader是NULL)

现在,加入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...)