2012-10-02 2 views
3

부모님이 학교에서 같은 학급에 다니는 모든 부모님을 찾고 싶습니다. 내가 잘못하고 있어요처럼 어떻게 든이 느낌이 나는 같은 두 번 가입 (약) 쓰고 있어요으로,SQL : 학부모가 내 부모와 같은 모든 자녀 찾기

SELECT child.* FROM child 
JOIN parent ON child.ParentID = parent.ID 
    WHERE parent.class IN (SELECT parent1.class 
    FROM parent1 JOIN child1 
     ON parent1.id = child1.parentID 
    WHERE child1.ID = MyID) 

,하지만 개선 할 수있는 방법을 알아낼 수 없습니다 :이 같은 쿼리를 작성할 수 있습니다 그것 (하위 쿼리를 중첩하는 다른 방법을 찾을 수는 있지만 그 중 아무 것도 깔끔하게 보이지 않습니다).

내가 누락 된 깔끔한 방법이 있습니까? 아니면이 일을 제대로하고 있습니까?

편집 : GolzeTrol은이 질문에 대한 (전체) 답변에서 지적했듯이 자녀가 한 명의 부모 만 갖는 것으로 제한 될 수 있습니다. 그는 정확하고 실제 가정에서이 쿼리를 실행하지는 않지만 각 자식이 실제로 하나의 부모와 만 연결된 다른 테이블에서 실행하려고했습니다.

답변

2

그냥 가입하십시오. 관련 부모와 자식을 얻으려면 두 테이블을 두 번 조인해야하지만 단순 내부 조인은 필요하지 않습니다. 각 테이블의 '역할'이 무엇인지 명확하게하기 위해 별칭 (이 경우 반드시 사용해야 함)을 추가했습니다.

select 
    otherkids.* 
from 
    child me 
    /* Join below is weird. I got only 1 parent... */ 
    inner join parent myparents on myparents.ID = me.ParentID 
    inner join parent otherparents on otherparents.class = myparents.class 
    inner join child otherkids on otherkids.ParentID = otherparents.ID 
where 
    me.ID = :MyID and 
    otherkids.ID <> me.ID /* Exclude myself */ 

난 내가 아이가 어머니와 아버지, 또는 두 개 이상의 부모가 생각하면서, 아이가 ParentID을 가지고 이상한 생각 말해야한다.

계통 학 프로그램은 종종 자녀를 한 가족에 넣습니다. 가족에게는 배우자와 자녀가 있습니다. 그렇게하면 부모를 모르는 경우 (또는 하나만 알면) 자녀를 연결할 수 있으며, 이혼하고 재혼하면 여러 가족과 쉽게 연결할 수 있습니다. 테이블 구조에 대한 제안 일 수도 있습니다.

+0

고마워, 그게 내가 원하는거야. 그냥 테이블에 가입하는 것을 생각하지 않았습니다. 구조에 관해서는, 당신 말이 맞아요. 저는 실제로 아이들과 부모들을 위해 이것을하는 것이 아니지만, 아이들이 부모를 하나 밖에 가지지 않는 데이터베이스의 일부 테이블에 대해서는 질문에 메모를 할 것입니다. –

-1

아마이 문제

SELECT 아이를 해결할 수 있습니다. * 아이 INNER가 child.ParentID = parent.ID INNER 가입 parent2 ON parent.class = parent2.class INNER 가입 자식 2 ON child2.ParentID = 부모의 가입 FROM child.ID = MYID 및 child2.ID <> MYID

확인 내가 @ GolezTrol의 솔루션에 동의이 다음 :)

2

을 시도,하지만 당신은 여전히 ​​당신의 방식으로 해결할 수 parent.ID . 작성한대로 쿼리를 작동 시키려면 @GolezTroi 솔루션에 따라 반환 된 자식에서 자신을 제외하고 외부 WHERE 절을 추가해야합니다.

또한 실행에 아무런 차이가 없지만 서브 쿼리가 하나의 레코드 만 반환 할 것으로 기대하기 때문에 'IN'스타일 하위 쿼리가 아닌 '='을 사용하는 것이 의미 상 정확합니다. (즉, 부모님에 있던 한 클래스) :

당신이 상관 하위 쿼리를 사용하고 문제가 여전히 거기에 물론
SELECT child.* FROM child 
JOIN parent ON child.ParentID = parent.ID 
    WHERE parent.class = (SELECT parent1.class 
    FROM parent1 JOIN child1 
     ON parent1.id = child1.parentID 
    WHERE child1.ID = MyID) 
    AND child.ID != MYID 

(즉, 당신은 외부 쿼리에 하위 쿼리에 가입 한)과 이러한 경향 다른 방법보다 처리하는 데 오래 걸립니다. 동일한 조인을 두 번 반복하는 것과 관련하여 SQL은 더욱 복잡한 쿼리, 특히 레코드를 같은 테이블의 다른 레코드와 관련시키는 레코드에서이를 수행해야하는 경우가 있습니다.

+0

'='vs'in'을 이용한 현명한 사고. 이 경우 하위 쿼리는 실제로 1 개의 레코드를 반환해야하며 MySQL은 특히 in입니다. 그리고 그 문제에 대한 subselects와 함께, 그래서 나는 내 '단순한 가입'을 선호합니다. ;-) – GolezTrol

관련 문제