Come soluzione non mi piace per niente perchè sfrutta la funzione find_in_set() che è propria di mysql. In attesa di un qualcosa di più standard prova questa.
codice:
select p.*,group_concat(op.tipooggetto order by op.tipooggetto) as posseduti
from persona as p
inner join oggettiposseduti as op
using (idpersona)
group by p.idpersona
having find_in_set(2,posseduti) = 0 and find_in_set(3,posseduti) = 0
edit. Così la preferisco.
codice:
select p.* from persona as p
left join (
select idpersona from oggettiposseduti
where tipooggetto = 2 or tipooggetto = 3
) as t
on p.idpersona = t.idpersona
where t.idpersona is null