我正在处理团队成员的列表。团队可以有1名领导者或2名共同领导者。
表:仓位
Position_ID | Position_Name
表:参与
Position_ID | Project_ID | Person_ID
在Position表中,Position_ID"7"的Position_Name为"Leader/Co Leader"。
假设有一个John(Person_ID=5),他参与了project_ID=2的项目,并且在那个项目中,他的Position_ID=7。
如果有Jim(Person_ID=9)也参与了该项目(project_ID=2)并担任该职位(position_ID=7),则Person_ID=5的John的职位为"共同领导者"。返回数组(person_id=>5,name=>John,position=>Co-leader,position _id=>7,project_id=>2)
如果没有,约翰的职位就是"领袖"。返回数组(person_id=>5,name=>John,position=>Leader,position _id=>7,project_id=>2)
到目前为止我的推理:
从"参与"中选择,加入"成员"以获取成员详细信息,加入"职位"以获取职位名称。
如果职位ID不是7,这意味着它不是领导者/共同领导者的情况,那么就顺其自然。
如果职位ID为7,请在参与中检查是否存在具有相同职位ID和项目ID但不同人员ID的记录。
如果有,从7号职位的名字中去掉后半部分,只返回"共同领导者"。如果没有,去掉前半部分,只返回"leader"。
问题:我不知道如何表达"另一条记录的人员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
在项目id和职位id相同的情况下,再次左联接职位表,但只获取职位id为7(领导者)且人员id不匹配的记录。如果没有这样的记录(该表中的值将为null),则它是一个leader,否则它就是一个co-leader。
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
也许这会让你朝着正确的方向前进。。但由于我不理解你对所需数据布局的看法。。。这可能不是你想要的。
联接只是识别同一项目中是否有两个人处于相同的位置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