(In case this seems familiar: I asked a different question similar to this one, but I just got a note that the site design has changed and now the owners do want a
If I understood your db structure properly, you need to find a row in rooms with no corresponding rows in availability.
SELECT r.* FROM rooms r LEFT JOIN availability a ON (r.id = a.room_id AND a.date_occupied BETWEEN :start_date AND :end_date) WHERE a.id IS NULL