我非常想找到一種方法,根據另一個表的行中的某些值過濾掉某個表的SELECT
中的行。基於不同表中的列從SELECT中移除行
我正在試驗下面的示例結構。我有一張博客文章內容表(每篇博文一行)和另一張有關帖子的元數據表(每個鍵值對一行;每行有一列將其與博客文章相關聯;每行多行博客文章)。我想拉posts
只有當metadata
其中metadata.pid=posts.pid AND metadata.k='optout'
沒有行。也就是說,對於下面的示例結構,我只想返回posts.id=1
行。
(基於我試過的)JOIN
s最終沒有刪除具有某些元數據的帖子,其中metadata.k='optout'
,因爲pid
的另一行元數據意味着它將其納入結果中。
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)
子查詢可以給我我想要的逆:
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,導致每一個pid
有一個元數據行其中k!='optout'
。
因此,讓我看看,如果我得到這個......對於選擇禁用後,子查詢相匹配的元數據行,所以metadata.mdid不爲空,所以它沒有被選中。但是沒有退出的帖子,子查詢不匹配一行,所以右側用空值填充,所以where子句爲真。 – alxndr 2011-01-12 18:59:42
我已經添加了另一節,以解釋如何加入工作,應該清除它的任何灰色地帶。希望有所幫助! – futureal 2011-01-12 21:08:33