我有两个表帖子和评论。表评论包含 post_id 属性。我需要输入所有帖子,类型为“打开”,其中没有评论类型为“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是否完美。
答案 0 :(得分:5)
你是对的 - 你可以做得更好。有关详细信息,请参阅this article 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')
答案 1 :(得分: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列。