Mysql其他表中未引用的行数

时间:2016-04-29 21:35:08

标签: mysql join relational-database

使用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,我怀疑它是最好的方法!

1 个答案:

答案 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)