使用mysql,我会跟踪用户是否在其他表中看过帖子
Table Posts:
id body
1 test1
Table user_views
post_id user_id
1 1
上面的行表示用户1已经看过帖子1
我的问题是如何才能获得用户没有看到的帖子数量-count包含user_views中行数的帖子?
过程: 每次用户打开博客页面我都会运行
select count(uv.post_id) as views_count,posts.id,posts.body
from posts left join user_views uv on uv.post_id = posts.id
group by posts.id
这将返回所有帖子以及已经有多少用户看到此帖子的数量
但我想显示用户在侧边栏上看不到的帖子数量,以便用户可以知道他还没有看到新帖子。
我的第一次尝试是
select count(*) from posts
where posts.id not in select post_id from user_views
where post_id = posts.id and user_id = 1
但它不是有效的mysql,我怀疑它是最好的方法!
答案 0 :(得分:1)
使用IS NULL检查的LEFT JOIN(或者就此而言是右连接)是可行的方法。
SELECT COUNT(*) FROM Post as posts
LEFT JOIN user_views
ON posts.id = user_views.post_id
WHERE user_id = 1 AND user_views.post_id IS NULL
我注意到你为了不同的目的而有一个LEFT JOIN。我相信它可以改为INNER JOIN以获得性能提升。
另请注意,在使用子查询时,在mysql中,需要用括号括起来以避免语法错误。更正的查询将获得与我给出的相同的结果。哪个更好将取决于您的索引。
select count(*) from Post as posts
where posts.id not in (select post_id from user_views
where post_id = posts.id and user_id = 1)