Я пишу этот код с учетом SQL Server, но он должен работать в Postgres. Если это не так, различия должны быть минимальными.
Это решение должно работать (у меня здесь не установлен Postgres), но вы можете оптимизировать его для больших наборов данных; использовать индексы, статистику и т.д ... (как обычно).
SELECT DISTINCT games.game_id FROM games INNER JOIN cards ON games.game_id = cards.game_id WHERE games.current_player_id is NULL and games.game_id in (SELECT DISTINCT game_id FROM GAME_VIEWS WHERE user_id != 666) and cards.author_id != 666 GROUP BY games.game_id ORDER BY cards.created_at DESC
Опять поменяйте местами "666" с фактическим идентификатором.
Надеюсь, это поможет!