別のテーブルの行の特定の値に基づいて、あるテーブルのSELECT
の行をフィルタリングする方法を探しています。異なるテーブルの列に基づいてSELECTから行を削除する
私は以下の構造例を試しています。私は、ブログ投稿のコンテンツ(ブログ記事ごとに1行)のテーブルと、投稿に関するメタデータの別のテーブル(キーと値のペアごとに1つの行、ブログの投稿と関連付ける列を持つ各行、ブログ記事)。 metadata
に行が存在しない場合に限り、posts
の行を取得したい場合は、metadata.pid=posts.pid AND metadata.k='optout'
となります。つまり、以下の構造例では、posts.id=1
の行を戻したいだけです。 のメタデータの他の行は、それが結果になることを意味するので、いくつかのメタデータを持つ投稿を削除しないでください。metadata.k='optout'
。メタデータの行を持つすべての単一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)
は、サブクエリは、私が何をしたいの逆数を与えることができますここで、
k!='optout'
。
ような何かを試すことができますが、サブクエリは、メタデータの行と一致するので、metadata.mdidはそうではなく、nullであります選択されません。しかし、optoutのないポストでは、サブクエリはローにマッチしないので、右側にはヌルが埋め込まれるため、where句は真です。 – alxndr
私は、結合がどのように働いているのか、それに伴う灰色の部分をクリアするべきであるという答えに別のセクションを追加しました。希望が助けてくれる! – futureal