Use:
select b.*
from propertyforrent b
join client a
on a.preftype = b.type
where a.fname = 'John'
and a.maxrent <= b.rent
The HAVING clause is for comparing aggregate values.
"a.preftype = b.type" is a join condition (use join clause)
"a.maxrent <= b.rent" is a horizontal comparison (not an aggregate/vertical comparison)