MySQL Query确定字段关系

时间:2011-05-14 09:54:29

标签: mysql

我有一个包含3个字段的表。 principalassociatestatus

如何确定登录用户是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])

associate_id | principal_id |状态

1 3 1
1 4 1
2 1 0
2 3 0
5 1 1
6 1 1

从上面有多少人与登录用户(1)相关联?

2 个答案:

答案 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