0

ブログに属する投稿を取得する次のクエリがあります

SELECT p.* 
FROM  `Posts` p
INNER JOIN Blogs b ON b.id = p.blog_id

「ON」の反対を行うMySQL関数はありますか? 「ブログ」データベース テーブルのブログに属していない投稿を照会したい場合 たとえば、ブログが削除された場合。

4

2 に答える 2

4

LEFT JOIN - NULL次のように、いずれかのコンボを使用する必要があります。

         SELECT p.*
           FROM Posts p
LEFT OUTER JOIN Blogs b
             ON b.id = p.blog_id
          WHERE b.id IS NULL

... またはNOT IN依存クエリ (いわゆる「アンチ結合」を使用):

       SELECT * 
         FROM Posts 
        WHERE blog_id NOT IN (SELECT id FROM Blogs)

私はほとんど最初の形式のみを使用していることを認めますが、実際には同様のパフォーマンスがあります。少なくとも、これらのクエリの類似点と相違点の詳細な説明が記載されたこの記事をざっと目を通しておくことをお勧めします。それは非常に啓発的な読書です。)

于 2012-10-18T23:15:36.923 に答える
2

それはすべてJOINについてです。

SELECT p.* 
FROM  `Posts` p
LEFT OUTER JOIN Blogs b ON b.id = p.blog_id

WHERE b.Id IS NULL

あなたのためにトリックを行う必要があります。

Jeff Atwood が結合の優れた概要を説明しています

この例では、LEFT OUTER JOIN が行うことは、ブログのすべての行と、同じ blog_id-Id の組み合わせを持つ投稿のすべての行と、およびブログに一致する ID を持たない投稿のすべての行と一致することです。この例では、これらの行はブログのエントリに対して NULL です (ブログがないため)。b.Id IS NULL

これを達成する方法は他にもいくつかあります。例えば:

SELECT * FROM Posts WHERE blog_id NOT IN (SELECT Id FROM Blogs)

事実上、これは blog テーブルにない blog_id を持つ投稿のすべての行をクエリします。

于 2012-10-18T23:15:55.833 に答える