MySQL - 寻找空关系

时间:2016-09-22 11:05:26

标签: mysql sql

我正在努力研究如何从我们的表格中获取团队领导者和团队成员的完整列表。 包括那些没有团队的团队领导。

我们有一个基本的数据结构,我们有一个表person,其中包含我们的基本人物对象。对于某些人,我们将此表扩展到details表中。

我们拥有的一条扩展信息是team_leader状态。我们有两个相关的详细信息来定义:detail_isTeamLeaderdetail_teamLeader。 第一个是布尔值,定义了一个简短的团队领导者列表。第二个定义了一个人团队负责人(理想情况下来自子集)。

_person table_
person_id
person_name

_detail table_
detail_id
detail_person_id
detail_isTeamLeader
detail_teamLeader

我可以使用以下查询让所有拥有团队的团队负责人:

SELECT tl.person_id AS tlref, tl.person_name AS tlname, 
per.person_id AS perref, per.person_name AS pername
FROM detail
LEFT OUTER JOIN person AS per ON detail.person = per.person_id
LEFT OUTER JOIN person AS tl ON detail_teamleader = tl.person_id
ORDER BY tlname, psname

但是,对于那些detail.isTeamLeader为真但但未在detail_teamLeader字段中出现的team_leaders,这会失败。

样本数据

person_id   person_name
1           Joe Bloggs
2           Fred Smith
3           Frank Jones
4           Amy Kelly

detail_id   detail_person_id   detail_isTeamLeader   detail_teamLeader
1           1                  1                     0
2           2                  1                     0
3           3                  0                     3 
4           4                  0                     3

在上面的示例中,Joe和Fred是团队领导。但是,Joe在他的团队中没有人,因此在结果集中省略了上面的查询。

我怀疑规范化数据结构可能是最好的答案,但有没有办法不这样做?

2 个答案:

答案 0 :(得分:1)

我理解您在人与细节之间存在一对一的关系,但并非所有人都有详细信息。

我不确定您是否只想让团队中的所有人(包括那些没有团队的人)获得团队领导,或者您想要一个包含所有人员的数据集团队领导信息。

在第一种情况下,您必须使用内部选择(或Sql server中的CTE)来选择所有团队领导者,并将其与详细信息和人员表联系起来。以下是您可以使用的查询:

select tl.person_id as tlref, tl.name as tlname, p.person_id as perref, p.name as pername 
from (
        select p.person_id,p.name 
        from @persons p 
        inner join @details d on d.person_id = p.person_id and d.is_temamleader = 1
) tl
left outer join @details d on d.team_leader = tl.person_id
left join @persons p on p.person_id = d.person_id

对于第二种情况(让所有人获得团队负责人信息):

select p.person_id as perref, p.name as pername, d.is_teamleader,  pTl.person_id as tlref, ptl.name as tlname
from @persons p
left outer join @details d on d.person_id = p.person_id
left outer join @persons pTl on pTl.person_id = d.team_leader

我怀疑第一个查询是你要求的,但我添加了第二个查询以防你需要它。请注意,我使用了表变量(@persons,@ details),所以用实际的表名替换它们。

答案 1 :(得分:0)

如果您需要所有团队领导和表'人'的所有记录 表'详细'中的相应记录我认为您可以使用此代码:

SELECT
  person_id, person_name
FROM
  person
LEFT JOIN
  detail 
ON 
  person.person_id = detail.person
WHERE
  detail.detail_isTeamLeader = 1