5

我有两个表帖子评论。表格评论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')

在这种情况下,我不确定 NOT EXISTS 是否是完美的构造。

4

2 回答 2

8

你是对的——你可以做得更好。有关详细信息,请参阅Quassnoi的这篇文章,但结论是:

这就是为什么在 MySQL 中搜索缺失值的最佳方法是使用 LEFT JOIN / IS NULL 或 NOT IN 而不是 NOT EXISTS。

使用重写的查询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 / 非 NULLable 列。

于 2010-06-07T21:41:08.847 回答