0
이미 선택한 행의 값을 기반으로 데이터베이스의 조인 된 테이블에서 행을 선택하려고합니다. 기본적으로 부모 행이나 그랜트 행이 활성화 된 경우 결과에 하위 행 또는 하위 행을 포함시킵니다.MySQL : 이미 선택된 행의 값을 기준으로 행 선택
내가 원하는 결과를 얻기 위해 JOINS
과 UNIONS
의 다른 조합을 사용해 보았습니다.
표 1 : (목표 구성원이 목표로 설정을 사용할 수 또는 전체) 목표
id | name | parent
---------------------------
A | Obj A | null
A1 | Obj A1 | A
A2 | Obj A2 | A
A2-1 | Obj A2.1 | A2
B | Obj B | null
B1 | Obj B1 | B
B1-1 | Obj B1.1 | B1
C | Obj C | null
C1 | Obj C1 | C
C1-1 | Obj C1.1 | C1
표 2 : memberObjectives 다음
내 예제 데이터입니다 (목표 회원이 목표로 완수 또는 설정 함)
id | objective | member | status
-----------------------------------
1 | A | 001 | goal
2 | A1 | 001 | complete
3 | C | 001 | goal
원하는 결과이 두 테이블을 가입하고 상태가 goal
또는 complete
OR 경우 부모 또는 조부모 목적은 goal
또는 complete
의 상태가 여기서 모든 행을 선택합니다. 부모 A
및 C
이 goal
및 A2-1
및 C1-1
의 상태가 포함되어 있기 때문에 그들이 goal
상태의 조부모가 있기 때문에
objective | member | name | status
------------------------------------------
A | 001 | Obj A | goal
A1 | 001 | Obj A1 | complete
A2 | 001 | Obj A2 | null
A2-1 | 001 | Obj A2-1 | null
C | 001 | Obj C | goal
C1 | 001 | Obj C1 | null
C1-1 | 001 | Obj C1.1 | null
A2
및 C2
이 포함되어 있습니다. B
의 B
테이블에 complete
또는 goal
상태의 테이블이 없으므로 해당 하위 및 그랜트 대상은 포함되지 않습니다. 내가 아는
내 최신 시도는, 다음과 같이 가까운 경우에도되지 않습니다 :
SELECT DISTINCT mo.objective, mo.member, o.name, mo.status
FROM objectives AS o
LEFT JOIN (SELECT * FROM memberObjectives
WHERE member = '001') AS mo ON o.id = mo.objective
LEFT JOIN objectives AS o2 ON o2.id = o.parent
LEFT JOIN objectives AS o3 ON o3.id = o2.parent
GROUP BY o.id
당신이 제공 할 수있는 모든 도움을 주셔서 감사합니다!
귀하의 ID가 A, A1 ... 등 숫자가 아니면 A ...를 원하는 유일한 것이면 쉽게 될 것입니다. 아니면 그저 당신의 모범인가? 왜냐하면 당신은 A를 걸러 낼 수 있기 때문입니다. 문제는 조부모가 조인만으로는 불가능하다는 것입니다. –
@JohnRuddell'A'는 단지 예제 일뿐입니다. 나는 '목표'또는 '완료'상태이거나 부모 나 조부모가있는 상태 인 모든 'A'와 'C'를 얻고 싶지만, 'B'가없는 사람은 회원이 아니기 때문에 'B'를 완료하거나 목표로 설정합니다. –
현재 테이블을 조인하는 방법이 있는지 궁금 해서요. 그래서'parentStatus'와'grandparentStatus'라는 두 개의 추가 열로 끝납니다. 따라서이 열들 중 하나 또는 원래의'status' 열이'goal' 또는 '완료'는 결과에 포함됩니다. ('WHERE status = '목표'OR 상태 = '완료'OR parentStatus = '목표'OR parentStatus = '완료'또는 grandparentStatus = '목표'OR grandparentStatus = '완료') –