我有一个包含3个字段的表。 principal
,associate
,status
。
如何确定登录用户是principal
还是associate
,以及他关联了多少人?我还想确定关系的status
。
query = "SELECT M.id, M.surname, M.firstname, R.principal_id
, R.associate_id, R.status
FROM tbl_members M, tbl_relationship R WHERE
-- ---------------------------------------------
-- to make sure user exists in the members table
-- ---------------------------------------------
(R.principal_id = M.id OR R.associate_id = M.id)
AND (logged-in-user = R.associate_id OR logged-in-user = R.principal_id)
AND R.status =1"
错误: - 这个列表是relationship
表中每个人的2倍。
表受欢迎: -
tbl_members(id,surname,firstname)
tbl_relationship(id,associate_id [FK tbl_member id],principal_id [FK tbl_member id])
1 3 1
1 4 1
2 1 0
2 3 0
5 1 1
6 1 1
从上面有多少人与登录用户(1)相关联?
答案 0 :(得分:0)
我仍然不能100%确定你的系统是如何工作的,但这就是我想出来的。
Select M.id, surname, firstname, NumPrincipal, NumAssociate, 'Type' =
Case
When NumPrincipal > 0 Then 'Principal'
Else 'Associate'
End
from
(Select * From tbl_members) AS M
Left Join
(Select M.id, COUNT(M.id) 'NumPrincipal' from
tbl_members M inner join tbl_relationship R on M.id = R.principal_id
Group By M.Id) AS P
On M.id = P.id
Left Join
(Select M.id, COUNT(M.id) 'NumAssociate' from
tbl_members M inner join tbl_relationship R on M.id = R.associate_id
Group By M.Id) AS A
On M.id = A.id
Where M.id = logged_in_user_id
对我来说仍然看起来很奇怪的部分是,如果他们发起关系,那么他们将成为委托人,但他们也可以成为另一个案件的合伙人,这取决于两个用户之间的特定关系。我的代码就是如果用户登录并且他们已经是委托人,那么他们就是委托人。不确定您是否希望代码与当前用户正在查看他们与其他用户的特定关系,找到该关系中的主要人员?
编辑:在查看当前用户与另一个用户之间的单个关系时,查看当前用户是否为主体的代码。这假设两个用户之间只有一个关系,否则您将获得多个记录。
Select *,
'type' =
case
when principal_id = currentUserId then 'Principal'
else 'Associate'
end
from tbl_relationship where
(associate_id = currentUserId or principal_id = currentUserId )
and
(associate_id = OtherUserId or principal_id = OtherUserId )
再次编辑,以下是无论校长/准会员的人数:
Select M.id, surname, firstname, NumAssociates
From
tbl_members M
Left Join
(Select id, count(NumAssociate) 'NumAssociates' From
((Select M.id, M.id 'NumAssociate' from
tbl_members M inner join tbl_relationship R on M.id = R.principal_id where status = 1)
Union All
(Select M.id, M.id 'NumAssociate' from
tbl_members M inner join tbl_relationship R on M.id = R.associate_id where status = 1)) AS T
Group By Id) AS N
on M.id = N.Id
答案 1 :(得分:0)
尝试:
SELECT
m.id, m.surname, m.firstname,
COUNT(assoc.id) AS relationships_as_associate,
COUNT(princ.id) AS relationships_as_principal
FROM tbl_members m
LEFT JOIN tbl_relationship assoc
ON assoc.associate_id = m.id AND assoc.status = 1
LEFT JOIN tbl_relationship princ
ON princ.principal_id = m.id AND princ.status = 1
WHERE m.id = logged-in-user
GROUP BY m.id
(猜测可以忽略与status = 0
的关系)
如果您只想要该用户所在的关系数量(无论用户的角色如何):
SELECT
m.id, m.surname, m.firstname,
COUNT(rel.id) AS active_relationships
FROM tbl_members m
LEFT JOIN tbl_relationship rel
ON (rel.associate_id = m.id OR rel.principal_id = m.id)
AND rel.status = 1
WHERE m.id = logged-in-user
GROUP BY m.id
编辑:
根据您的评论,这是一个查询,它将获取与登录用户有关系的所有用户,他们的详细信息以及他们在关系中扮演的角色(其中一些是校长,其他人是联系人):
SELECT m.id, m.firstname, m.surname, temp.role
FROM tbl_members m
JOIN ((SELECT rel.principal_id as id, 'Principal' as role
FROM tbl_relationship rel
WHERE rel.associate_id = logged-in-user
AND rel.status = 1)
UNION
(SELECT rel.associate_id as id, 'Associate' as role
FROM tbl_relationship rel
WHERE rel.principal_id = logged-in-user
AND rel.status = 1)
) as temp
ON temp.id = m.id