我正在处理团队中的成员列表。该团队可以有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
答案 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