Это должно к подвоху
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
Первое объединение, которое вы делали, на самом деле является внутренним объединением, потому что оно никогда не «пропускает огонь».
При втором соединении иногда произойдет сбой, потому что у вас есть условие extra .
Поэтому использование post_reads.some_id is null
никогда не будет правдой.
Для того, чтобы это работало, вам нужно будет повторить AND post_reads.user_id = x
и в этом условии соединения, но вставлять его дважды глупо и не нужно, один раз это сделает.
PS не забудьте заменить 'x' на что-то более полезное: -)