Во-первых, я думаю, что ваша идея сделать блокировку симметричной неверна.Представьте себе случай, когда user1 блокирует user2, что в вашем случае создаст два блока в обоих направлениях.Что если user1 решит разблокировать user2?В этом случае вам нужно будет удалить две записи.Но что, если они оба хотели бы заблокировать друг друга?В этом случае у вас также будет две записи.Таким образом, разблокировка становится двойственной.Я предлагаю создать одну запись, когда user1 блокирует user2 и искать и blocker_id, и block_id, поэтому проверяем, кто не может видеть, чей пост будет выглядеть так:
select *
from User
join Block
on User.id = Block.blocker_id or User.id = Block.blocked_id
Теперь давайте посмотрим на ваш запрос.Вам не нужно объединяться с Block, вместо этого вам нужно будет проверить, существует ли запись Block:
select *
from Post p
where p.user_id = @current_user_id and
not exists (select id
from Block
where Block.blocker_id = p.user_id or Block.blocked_id = p.user_id)
Обратите внимание, что я не очень много работал с PostgreSQL (но много с SQL в целом),поэтому, если у меня есть некоторые синтаксические ошибки, то это может быть связано с моей нубизмом в PostgreSQL.
EDIT
Решением является следующий код:
select *
from Post p
where
not exists (select id
from Block
where ((Block.blocked_id = p.user_id) and (Block.blocker_id = @current_user_id)) or ((Block.blocked_id = @current_user_id) and (Block.blocker_id = p.user_id))
Объяснение:Нам нужно найти записи блоков, где либо текущий пользователь блокирует автора, либо автор блокирует текущего пользователя.