5

2つのテーブル投稿コメントがあります。テーブルコメントにはpost_id属性があります。タイプ「open」のすべての 投稿を取得する必要があります。タイプ「good」のコメントはなく、作成日は5月1日です。

このようなSQLクエリを使用するのが最適ですか?

SELECT  posts.* FROM  posts  
WHERE NOT EXISTS (
SELECT comments.id FROM comments WHERE comments.post_id = posts.id 
AND  comments.comment_type = 'good' AND 
comments.created_at BETWEEN '2010-05-01 00:00:00' AND '2010-05-01 23:59:59')

この状況でNOTEXISTSが完璧な構造であるかどうかはわかりません。

4

2 に答える 2

8

あなたは正しいです-あなたはより良くすることができます。詳細については、 Quassnoiによるこの記事を参照してください。ただし、結論は次のとおりです。

そのため、MySQLで欠落している値を検索する最良の方法は、NOTEXISTSではなくLEFTJOIN /ISNULLまたはNOTINを使用することです。

を使用して書き直されたクエリNOT INは、次のようになります。

SELECT *
FROM posts  
WHERE posts.id NOT IN (SELECT post_id
                       FROM comments
                       WHERE comments.comment_type = 'good'
                       AND comments.created_at BETWEEN '2010-05-01 00:00:00'
                                                   AND '2010-05-01 23:59:59')
于 2010-06-07T21:39:21.300 に答える
1

それが速いかどうかわからない、あなたはそれをチェックすることができます:

SELECT * FROM posts
LEFT JOIN comments 
ON comment.postid = post.id
AND comment.comment_type='good'
WHERE comment.postid IS NULL

postidがNULL/NULL不可の列になることはないと想定します。

于 2010-06-07T21:41:08.847 に答える