2011-09-22 7 views
0

여기에 일대 다 관계가 있습니다. 또한 모든 "기본"레코드가 두 번째 데이터베이스 테이블에 조인 된 레코드를 갖는 것은 아닙니다.MySQL - 복잡 LEFT JOIN

tbl_customers tbl_addresses 테이블에 tbl_addresses

tbl_customers에 고객 기록이 분명히 많은 주소를 가질 수 있습니다 : 여기

내 테이블입니다.

여기 내 딜레마가 있습니다. 여러 주소가있는 많은 고객 레코드가 있으며 고객 레코드의 "주"주소로 해당 주소 레코드 중 하나를 지정합니다. 이것은 단순히 column이라는 단일 번호 : primaryAddress입니다. 주소 레코드가 주 주소 인 경우 값은 1입니다.

그래서 여기 내 쿼리입니다 :

SELECT c.customername, a.state 
FROM `tbl_customers` c 
LEFT JOIN `tbl_addresses` a ON c.customerid = a.customerid 

그 쿼리가 1 개 이상의 주소를 가진 모든 고객에 대한 중복 레코드가 발생합니다. 내가 왼쪽으로 조금 더 추가하면 가입 :

SELECT c.customername, a.state 
FROM `tbl_customers` c 
LEFT JOIN `tbl_addresses` a ON c.customerid = a.customerid AND a.primaryAddress = 1 

이 어떤 결과를 얻을 수 없다, 나는 데이터베이스에서 볼 경우에도 1

그래서 난 = 주소 기록을 많이 primaryAddress에있다 내 질문이 잘못된 것 같아.

누군가 내가 누락 된 부분을 볼 수 있습니까? 이 올바르게

사용자는 논의 후 원인을 찾을 수 있었다 질문에 대답하지 않습니다

: 솔루션을 찾고이 페이지에 착륙하는 일이 누군가에게

+0

나는 많은 고객 기록이 아직 주소 레코드하지 않고 있다는 것을 추가해야합니다. 나는 여전히 그 고객을 표시해야하지만 a.state는 비워 둡니다.(그래서 내가 LEFT JOIN을 선택했다). – coffeemonitor

+1

두 번째 쿼리가 작성된대로 잘못 된 것이 없습니다. 네가 빠뜨린 것이있어? –

답변

0

여기 문제. 그가 원래 코드에 오타가 있다고 밝혀졌습니다. 질문에 게시 된 두 번째 SQL 코드 블록은 정확하며 예상 결과는이어야합니다. +1을 사용자 JoeStefanelli에게 알려 주면됩니다.

자세한 내용은 의견을 읽어보십시오. 저의 원래 답은 아래와 같습니다. 이제 나는 그것이 그것을 깨닫 자마자 내가 그것을 고치려고하는 대신 삭제해야한다는 것을 알았다.

당신은 거의 다 있습니다 : 적어도 논의는


내 원래의 대답은 ... 사용자가 해결책을 찾을 수있었습니다. 대신 WHERE 절에 a.primaryAddress = 1을 추가하십시오.

편집

이 결과에서 제로 주소로의 costumers를 제외한다면 확실하지 ...

+0

아니요. WHERE 절에 조건을 추가하면 JOIN이 INNER JOIN처럼 작동합니다. 그것이있는 곳은 정확합니다. –

+0

당신 말이 맞아요. 주소가없는 고객은 제외됩니다. 그것을 – coffeemonitor

+0

그래, 내가 대답 한 후에도 깨달은 것. 하지만 귀하의 질문에 두 번째 쿼리 결과가 생성되지 않습니다 왜 볼 수 없어! 나는 비슷한 구조로 테스트하고 있으며, 그것은 나를 위해 작동합니다. – bfavaretto

관련 문제