2017-05-26 52 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

相關問題