计算未查看帖子的数量

时间:2011-05-05 20:50:12

标签: mysql sql join

我有一个db结构,如:

帖子

id
title
content

用户

id
....

post_reads

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

我知道我做错了什么,虽然我不确定那是什么。

2 个答案:

答案 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关键字。