存在取决于类似记录的返回值

时间:2015-11-17 14:45:31

标签: php mysql

我正在处理团队中的成员列表。该团队可以有1名领导或2名共同领导。

表:职位

Position_ID | Position_Name

表:参与

Position_ID | Project_ID | Person_ID

位置表中,Position_ID'7'具有Position_Name'领导者/共同领导者'。

假设John(Person_ID = 5)参与Project_ID = 2的项目,并且在该项目中他有Position_ID = 7.

  • 如果Jim(Person_ID = 9)也参与该项目(Project_ID = 2)并且也在该位置(Position_ID = 7),则Person的ID = 5的John的位置是'Co -领导'。返回数组(person_id => 5,name => John,position => Co-leader,position_id => 7,project_id => 2)

  • 如果没有,John的位置是“Leader”。返回数组(person_id => 5,name => John,position => Leader,position_id => 7,project_id => 2)

到目前为止我的理由:

  • 从参与中选择,加入会员以获取会员详细信息并加入职位以获取职位名称。

  • 如果位置ID不是7,这意味着它不是领导者/共同领导者的情况,那就让它成为。

  • 如果职位ID为7,请检查Involvement是否存在具有相同职位ID和项目ID但人员ID不同的记录。

  • 如果有的话,将后半部分从位置#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 

2 个答案:

答案 0 :(得分: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 

答案 1 :(得分:0)

在项目ID和位置ID相同的情况下,再次加入位置表,但只获取位置ID为7(领导者)且人员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