나는 다른 테이블의 행에있는 특정 값을 기반으로 한 테이블의 SELECT
에서 행을 필터링하는 방법을 찾고 있습니다.다른 테이블의 열을 기반으로 SELECT에서 행 제거
아래 예제 구조로 실험하고 있습니다. 블로그 게시물의 내용 (블로그 게시물 당 한 행)과 게시물에 대한 메타 데이터의 다른 테이블 (키 - 값 쌍당 하나의 행, 블로그 게시물과 연관된 열이있는 각 행, 각 행에 대한 많은 행)이 있습니다. 블로그 게시물). metadata
에 행이없는 경우에만 posts
행을 가져 오려면 metadata.pid=posts.pid AND metadata.k='optout'
입니다. 즉, 아래 예제 구조에서는 posts.id=1
행만 반환하려고합니다.
pid
에 대한 메타 데이터의 다른 행이 결과로 만드는 의미하기 때문에
JOIN
의 일부 메타 데이터 곳
metadata.k='optout'
이 게시물을 제거 끝나지 않는다 (I 무엇을 시도했다 기준). 메타 데이터 행이 매
pid
의 원인,
mysql> select posts.* from posts where pid = any (select pid from metadata where k = 'optout');
+-----+-------+--------------+
| pid | title | content |
+-----+-------+--------------+
| 2 | Bar | More content |
| 3 | Baz | Something |
+-----+-------+--------------+
2 rows in set (0.00 sec)
...하지만 pid != any (...)
를 사용하는 것은 나에게 게시물의 행의 3을 제공합니다
mysql> select * from posts;
+-----+-------+--------------+
| pid | title | content |
+-----+-------+--------------+
| 1 | Foo | Some content |
| 2 | Bar | More content |
| 3 | Baz | Something |
+-----+-------+--------------+
3 rows in set (0.00 sec)
mysql> select * from metadata;
+------+-----+--------+-----------+
| mdid | pid | k | v |
+------+-----+--------+-----------+
| 1 | 1 | date | yesterday |
| 2 | 1 | thumb | img.jpg |
| 3 | 2 | date | today |
| 4 | 2 | optout | true |
| 5 | 3 | date | tomorrow |
| 6 | 3 | optout | true |
+------+-----+--------+-----------+
6 rows in set (0.00 sec)
는 서브 쿼리 나에게 내가 원하는 걸의 역을 제공 할 수 있습니다 where
k!='optout'
.
뭔가를 시도 할 수는 하위 쿼리는 메타 데이터 행을 일치하므로 metadata.mdid 그렇게하지 null의 경우 선택되지 않습니다. 그러나 optout이없는 게시물 인 경우 하위 쿼리는 행과 일치하지 않으므로 오른쪽에 null이 채워 지므로 where 절이 true입니다. – alxndr
나는 조인이 어떻게 작동하는지에 대한 답변에 또 다른 섹션을 추가했습니다.이 섹션에는 회색 영역이 없어야합니다. 희망이 도움이됩니다! – futureal