using mysql, i keep track of if user saw post or not yet in other table
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
A LEFT JOIN (or for that matter a right join) with an IS NULL check is the way to go.
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
I notice that you aleady have a LEFT JOIN for a different purpose. I do believe that it can be changed to INNER JOIN to get a performance boost.
Also note that in mysql when you are using a subquery, you need to sorround it with brackets to avoid a syntax error. The corrected query will achieve the same result as what I have given. Which will be better will depend on your indexes.
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)