我有一个db结构,如:
id
title
content
id
....
post_id
user_id
如何计算ID为x
的特定用户没有阅读记录的帖子数。
我的SQL查询目前看起来像:
SELECT COUNT(posts.id) AS c
FROM `posts`
LEFT JOIN `post_reads` ON (`posts`.`id` = `post_reads`.`post_id`)
LEFT JOIN `users` ON (post_reads.user_id = `users`.`id` AND post_reads.user_id = x)
WHERE users.id IS NULL
AND post_reads.user_id IS NULL
我知道我做错了什么,虽然我不确定那是什么。
答案 0 :(得分:2)
这应该是技巧
SELECT COUNT(posts.id) AS c
FROM posts
LEFT JOIN post_reads ON posts.id = post_reads.post_id AND post_reads.user_id = x
LEFT JOIN users ON post_reads.user_id = users.id
WHERE users.id IS NULL
请注意,如果您对使用表用户不感兴趣,可以将此查询缩短为:
SELECT COUNT(posts.id) AS c
FROM posts
LEFT JOIN post_reads ON posts.id = post_reads.post_id AND post_reads.user_id = x
WHERE post_reads.user_id IS NULL
你正在做的第一次加入真的是一个内部联接,因为它永远不会'失火'。
第二次加入有时会失败,因为那里有额外条件
因此,使用post_reads.some_id is null
永远不会成真
为了实现这一点,你必须在该连接条件中重复AND post_reads.user_id = x
,但是将它放入两次是愚蠢的,不需要,一旦完成。
PS不要忘记用更有用的东西替换'x': - )
答案 1 :(得分:1)
我尝试了几种方法只使用JOINS / WHERE,但是他们往往会错过某些情况(即你可以排除加入给定用户的阅读记录的帖子,但如果帖子的ID也会被返回加入以读取其他用户的记录。)
最简单的方法可能是这样的:
SELECT COUNT(DISTINCT id)
FROM posts
WHERE id NOT IN (SELECT DISTINCT post_id FROM post_reads WHERE user_id = @x)
另外,请注意,我不认为你需要在反引号中包含标识符,除非它们是MySQL关键字。