2017-02-01 2 views
0

Left Join을 사용하려는 상황을 처리하는 방법 데이터가 존재할 수도 있고 존재하지 않을 수도 있기 때문에. 그러나 Left Join이 일부 데이터를 찾으면 왼쪽에 조인 된 데이터를 다른 테이블에 조인하여 왼쪽으로 조인 된 데이터를 더 제한하고 싶습니까? (결과에서 원래 데이터를 제거하지 않고).왼쪽 추가 조건/참여로

Join, Where 또는 하위 쿼리가 필요할 수 있습니다.

SELECT users.*, failed_logins.* 
FROM users 
LEFT JOIN failed_logins ON failed_logins.user_id = users.user_id 
INNER JOIN banned ON banned.ip_address = failed_logins.ip_address 

을하지만이 failed_logins 일치 banned에 데이터가없는 경우 데이터가 표시되지됩니다 :

는 여기에 내가 뭘하려합니다.

banned에 일치하는 행이있는 경우 bannedfailed_logins의 행을 포함시키고 자합니다. 그렇지 않은 경우 failed_loginsbanned의 행을 제외해야합니다. 그러나 데이터는 항상 users에서 가져와야합니다.

+1

질문이 내게 명확하지 않습니다 .. 쿼리를 업데이트하고 적절한 데이터 샘플 및 예상 결과를 추가하십시오. – scaisEdge

+0

user.user_id가 emails.email_id와 같아야하는 이유는 무엇입니까? 어쩌면 테이블 구조를 추가하여 도움을 줄 수 있습니다. –

+0

의견을 주셔서 감사합니다. 질문을 최대한 명확하게 업데이트했습니다. 필요한 경우 나중에 예제 데이터를 추가 할 예정이지만 지금 당장 출발해야합니다. – Andrew

답변

2

INNER JOIN의 조건은 failed_logins.ip_address에 NULL이 아닌 값을 요구할 것입니다. 해당 열의 NULL 값을 가진 행은 제외됩니다. 그리고 그것은 failed_logins에 결합의 "outerness"를 부정하기 위하여려고하고있다. (failed_logins에 일치하는 행이없는 users의 모든 행, 외부는 failed_logins에서 더미 일치하는 행을 발명합니다 가입, 일치하는 더미 행의 모든 ​​열이 NULL이됩니다. 그래서

을, 우리는 필요 failed_logins.ip_addressNULL 값을 허용 할 수있는 방법이 반환된다.

하나의 옵션은 내부가 외부를 조인 있는지 확인하는 것입니다. 즉, LEFTINNER을 대체한다.

이 유형을 접근하는 다른 방법이 있습니다

그러나 실제로 어떤 결과가 반환되기를 원하는지에 달려 있습니다. 예제 데이터 예상 결과는 사양을 명확히하는 데 많은 도움이됩니다.


편집

질문을 다시 읽고 나면, 우리가 돌려 원하는 결과 아직 분명하지 않다. 왜 banned 테이블을 볼 필요가 있습니까? "존재하는 경우 데이터를 필터링하는"것은 실제로 사양을 설명하지는 않습니다.

일치하는 행이 banned 인 경우 은 결과 집합의 행을 제외 하시겠습니까? 또는 일치하는 행이 존재하지 않는 행을 banned에 반환하려고합니다.


후속는 인라인 관점에서 failed_logins 및 제 banned 간의 조인 않도록 (또는, 유래 표는 MySQL의 용어를 사용하는). 그런 다음 users과 파생 테이블을 외부 조인합니다.일례로서

:

SELECT users.* 
    , fl.* 
    FROM users 
    LEFT 
    JOIN (SELECT f.user_id 
       , f.ip_address 
      FROM failed_logins f 
      JOIN banned b 
      ON b.ip_address = f.ip_address 
     ) fl 
    ON fl.user_id = users.user_id 
ORDER BY users.user_id, fl.ip_address 

주어 failed_logins 샘플 데이터 :

user_id  ip_address 
---------- ------------ 
    111  127.0.0.1 
    111  192.168.0.1 
    222  127.0.0.1 
    333  192.168.0.1 
    444  4.4.4.4 

banned 샘플 데이터

ip_address 
---------- 
127.0.0.1 

users 다섯 행 555-111 포함 가정하면 검색어는 다음을 반환해야합니다.

user_id user_id ip_address 
------- ------- ---------- 
111  111  127.0.0.1 
222  222  127.0.0.1 
333  (null) (null) 
444  (null) (null) 
555  (null) (null) 

이것이 사양을 만족하지 않는 경우 예상 결과와 함께 몇 가지 샘플 데이터 (반환해야 할 행과 반환하지 말아야 할 행의 예 포함)를 제공하는 것이 좋습니다.

+0

노력에 감사드립니다. 가능한 한 명확한 질문을 업데이트했습니다. 필요한 경우 나중에 예제 데이터를 추가 할 예정이지만 지금 당장 출발해야합니다. – Andrew