2015-11-17 50 views
0

我在工作組中的成員名單。該團隊可以有1個領導或2個共同領導。根據類似記錄的返回值存在

表:位置

Position_ID | Position_Name 

表:參與

Position_ID | Project_ID | Person_ID 

位置表,Position_ID '7' 有Position_Name「負責人/聯合領導者。

假設有約翰(PERSON_ID = 5)誰需要與PROJECT_ID = 2項目的一部分,並在該項目中,他有Position_ID = 7

  • 如果吉姆(PERSON_ID = 9),誰也參與該項目(Project_ID = 2)並且在該位置(Position_ID = 7)服務,John與Person_ID = 5的位置是「共同領導者」。返回數組(person_id => 5,name => John,position =>副領導,position_id => 7,project_id => 2)

  • 如果沒有,John的位置是'Leader'。返回陣列(爲person_id => 5,名稱=>約翰,位置=>組長position_id => 7,PROJECT_ID => 2)

我的理由至今:

  • 從參與選擇,加入會員以獲取會員詳細信息並加入職位以獲取職位名稱。

  • 如果職位ID不是7,這意味着它不是領導者/副領導者案例,那麼就讓它成爲。

  • 如果位置ID是7,如果存在具有相同位置ID和項目ID但不同人員ID的記錄,則檢入Involvement。

  • 如果存在,則將後半部分從位置#7名稱中刪除並僅返回「共同領導者」。如果沒有,則切斷前半部分,只返回「領導者」。

問題:我不知道如何表達「另一條記錄的人員ID與當前記錄的人員ID不同」。

簡體MySQL的

SELECT 
    IF(`i`.position_id = 7, 
     IF(EXISTS(SELECT 1 FROM `i` WHERE ????), 
      SUBSTRING..., 
      SUBSTRING...) 
     ,po.`name`) 
    AS `position`, 
    FROM `involvements` i 
    JOIN `members` m ON m.`id` = i.`person_id` 
    JOIN `positions` po ON po.`id` = i.`position_id` 
    WHERE i.`project_id` = 2 
+1

對不起,您如何確定哪一位是副領導? – Strawberry

+0

如果在Involvement表中有兩行具有相同的Project_ID和相同的Position_ID但不同的Person_ID。 –

+0

我想我需要可視化所需的結果,因爲我可以看到多種方式來返回共同領導者記錄,但我不確定你期望在數據集中。你能提供一個預期結果的樣本嗎?如果共同領導人存在,對於左側加入到位置後的參與和成員來返回附加列。根據人員ID尚未在記錄中定義的位置加入。但我不知道是否需要添加列或其他不同的東西... – xQbert

回答

0

也許這將讓你在正確的方向前進。但我不明白你想要的數據佈局的觀點......它可能不是你到底是什麼後。

連接只是簡單地標識同一項目中是否有兩個人具有相同的位置7.如果找到任何記錄,那麼這些記錄是在案例聲明中標識的共同領導。

SELECT i.person_Id 
    , m.name as MemberName 
    , case when i2.po.position_ID is null then po.name 
      else 'Co-Leader' end as Position 
FROM `involvements` i 
JOIN `members` m 
    ON m.`id` = i.`person_id` 
JOIN `positions` po 
    ON po.`id` = i.`position_id` 
LEFT JOIN involvements i2 
    on i2.`position_Id` = po.`position_ID` 
and po.position_ID = 7 
LEFT JOIN members m2 
    on m2.`id` = i2.`personID` 
and m2.`person_ID` <> m.`person_ID` 
WHERE i.`project_id` = 2 
+0

我想要得到這樣的結果:array(person_id => 5,name => John,position => Co-leader,position_id => 7,project_id => 2)或array(person_id => 5,name = > John,position => Leader,position_id => 7,project_id => 2),具體取決於是否存在Jim。 –

+0

更新...增加了7(領導者/ coleader)的位置特定連接,並增加了將名稱轉換爲共同領導者並將字段限制到所需字段的情況。 – xQbert

+0

爲什麼你加入會員表兩次? i2涉案表已經包含person_id,如果這與i的別名不一樣,那麼它不是同一個人。通過這種修改,您可以獲得我提供的解決方案。 – Shadow

0

LEFT JOIN位置表再一次在項目ID和位置ID相同,但只取有7個(領導者)的位置ID和個人ID不匹配的記錄。如果沒有這樣的記錄(該表中的值將爲空),那麼它是領導者,否則它是共同領導者。

SELECT 
    IF(i2.person_id is null,'leader','co-leader') 
    AS `position`, 
    FROM `involvements` i 
    INNER JOIN `members` m ON m.`id` = i.`person_id` 
    INNER JOIN `positions` po ON po.`id` = i.`position_id` 
    LEFT JOIN `involvements` i2 on i.project_id=i2.project_id and i.position_id=i2.position_id and i.person_id<>i2.person_id and i2.position_id=7 
    WHERE i.`project_id` = 2 
+0

我需要將這種方法應用於其他類型團隊的總裁/聯合總裁案例,因此我應該使用SUBSTRING替換「領導者」,「共同領導者」? –

+0

是的,你必須。此外,您需要在左連接的連接條件中提供這些位置ID,以防位置ID不同。我會使用in()運算符。 – Shadow