The purpose is to ONLY show users that are not already assigned to the offer (which is why I use an $id). Problem is, users 1, 2 and 3 are assigned to both demands 1 and 2, so when I open the view that should show users that can be assigned to demand 2, I do have users 1, 2 and 3 because they're assigned to demand 1. My query doesn't filter that, and I've no clue how to do it.

Normally this is done with a LEFT OUTER JOIN (as you have done), but with the specific check done in the ON clause of the JOIN rather than just the WHERE clause. Then you check for a NULL field in the table that has been LEFT OUTER JOINed to check no match has been found:-