Я бы просто использовал агрегацию:
SELECT p.userName
FROM projects p
GROUP BY u.userName
HAVING SUM( MONTH(p.date) = MONTH(CURRENT_DATE()) AND
YEAR(p.date) = YEAR(CURRENT_DATE()) AND
p.city = 'Bordeaux'
);
Если у вас есть отдельный список пользователей, я бы использовал NOT EXISTS
:
select u.*
from users u
where not exists (select 1
from projects p
where p.username = u.username and
month(p.date) = month(CURRENT_DATE()) and
year(p.date) = year(CURRENT_DATE()) AND
p.city = 'Bordeaux'
);