INNER JOIN의 조건은 failed_logins.ip_address
에 NULL이 아닌 값을 요구할 것입니다. 해당 열의 NULL 값을 가진 행은 제외됩니다. 그리고 그것은 failed_logins
에 결합의 "outerness"를 부정하기 위하여려고하고있다. (failed_logins
에 일치하는 행이없는 users
의 모든 행, 외부는 failed_logins
에서 더미 일치하는 행을 발명합니다 가입, 일치하는 더미 행의 모든 열이 NULL이됩니다. 그래서
을, 우리는 필요 failed_logins.ip_address
의 NULL
값을 허용 할 수있는 방법이 반환된다.
하나의 옵션은 내부가 외부를 조인 있는지 확인하는 것입니다. 즉, LEFT
와 INNER
을 대체한다.
이 유형을 접근하는 다른 방법이 있습니다
그러나 실제로 어떤 결과가 반환되기를 원하는지에 달려 있습니다. 예제 데이터 예상 결과는 사양을 명확히하는 데 많은 도움이됩니다.
편집
질문을 다시 읽고 나면, 우리가 돌려 원하는 결과 아직 분명하지 않다. 왜 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)
이것이 사양을 만족하지 않는 경우 예상 결과와 함께 몇 가지 샘플 데이터 (반환해야 할 행과 반환하지 말아야 할 행의 예 포함)를 제공하는 것이 좋습니다.
질문이 내게 명확하지 않습니다 .. 쿼리를 업데이트하고 적절한 데이터 샘플 및 예상 결과를 추가하십시오. – scaisEdge
user.user_id가 emails.email_id와 같아야하는 이유는 무엇입니까? 어쩌면 테이블 구조를 추가하여 도움을 줄 수 있습니다. –
의견을 주셔서 감사합니다. 질문을 최대한 명확하게 업데이트했습니다. 필요한 경우 나중에 예제 데이터를 추가 할 예정이지만 지금 당장 출발해야합니다. – Andrew