테이블에서 팀 리더와 팀원의 전체 목록을 얻는 방법을 배우려고합니다. 팀이없는 팀 리더 인을 포함합니다.MySQL - 빈 관계 찾기
기본 인물이 들어있는 표 person
이있는 기본 데이터 구조가 있습니다. 특정 사용자의 경우 details
표에서이 표를 확장합니다.
우리가 가지고있는 확장 된 정보 중 하나는 team_leader 상태입니다. 이를 정의하는 관련 세부 사항이 두 개 있습니다 (detail_isTeamLeader
및 detail_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
팀 리더입니다. 그러나 조는 팀원 중 아무도 가지고 있지 않으므로 위 쿼리에서 결과 집합은 생략됩니다.
데이터 구조를 정규화하는 것이 가장 좋은 방법 일 수 있다고 생각하지만이를 수행하지 않는 방법이 있습니까? 당신은 테이블 '세부'나는 당신이 코드를 사용할 수 있습니다 생각에 기록을 대응하는 모든 팀 리더 및 테이블 '사람'의 모든 기록이 필요한 경우
샘플 데이터와 원하는 결과는 현재 가지고있는 문제를 전달하는 데 도움이됩니다. –
사람 테이블을 확장하는 경우 a) 세부 테이블에 person_id가 기본 키로 있어야하며 b) 항상 사람 테이블에서 시작하여 거기에서 왼쪽으로 조인 (또는 오른쪽 조인 사용)해야합니다. – Solarflare
데이터 예제를 추가하고'detail_person'이'person_id'의 열쇠임을 분명히했습니다. –