0

投稿とそのカテゴリを表す 2 つのテーブルがあります。
簡略化されたテーブル スキーマを次に示します。

posts                post_categories
-----               ----------------
-id                 -post_id
-title              -cat_id
-text

これで、カテゴリ「5」に属さないすべての投稿を取得する必要があります。

SELECT * FROM `posts` WHERE id NOT IN( SELECT id FROM `posts`, 
`post_categories` AS cat WHERE cat.cat_id=5 AND posts.id=cat.post_id ) 

投稿はどのカテゴリにも属さないため、サブクエリを使用しています。

cat_id!=5 AND posts.id=post_id

カテゴリのない投稿は取得できません。

サブクエリを実行するよりも良い方法はありますか?

4

3 に答える 3

2

LEFT JOIN を実行します。

SELECT DISTINCT `field1`,`field2`...etc FROM `posts` a LEFT JOIN `post_categories` b ON a.id=b.post_id  WHERE b.cat_id <> 5

うまくいくはずです!

于 2013-04-09T09:15:52.670 に答える
1

左結合を行うことは、通常、パフォーマンスの点で「優れています」。次のようにします。

SELECT * FROM `posts` 
    LEFT JOIN `post_categories` AS cat ON posts.id=cat.post_id AND cat.cat_id=5
WHERE  cat.cat_id IS NULL
于 2013-04-09T09:16:05.683 に答える